应用密码学(张仕斌)第四章
生活随笔
收集整理的這篇文章主要介紹了
应用密码学(张仕斌)第四章
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 分組密碼
- 特點:
- 現代密碼學中的重要體制之一,其主要任務是提供數據保密性
- 分組密碼加解密速度較快(對稱密碼特點)
- 現代分組密碼發展非常快,技術較成熟(公開測評) ,使用廣泛
- 示例:
- 注意事項:
- 從這章開始,假定加密和認證的文本、圖像、音頻等任何格式的原始信息,都存在相應的編碼方式,轉化為二進制的數據流。在具體算法中,表示為message={0,1}*
- 定義:
- 已知明文經過編碼后的二元消息序列x1x2…(即0,1二進制序列),分組密碼首先將二元序列按照固定長度進行分組,不妨設明文固定分組長度為nbits,則明文二元消息序列x1x2…劃分為長度為nbits的分組p1,p2…,即:
- 其中x,y,z ∈ GF(2) 。
- 加密過程
- 各明文分組長度依次在密鑰K={k1k2…kt}控制下,按照加密算法E進行加密得到密文分組c1,c2…,即:
- 解密過程
- 將密文分組c1,c2… 。在密鑰K={k1k2…kt}控制下,按照解密算法D進行解密,得到明文分組p1,p2…,即:
- 形式轉換
- 定義 一個分組密碼體制(P, K, C, E, D),其中P=C={0,1}^l ;K={0,1}^t.
- 加密變換:E:P×K→C, 當k∈K確定時,Ek為P →C的一 一映射.
- 解密變換:D: C×K →P, 當k∈K確定時,Dk為C →P的一 一映射.
- 壓縮、拓展
- 上述分組密碼系統中,明文分組長度為n bits,密文分組長度為m bits,密鑰長度為t bits。若n>m,明文分組長度大于密文分組長度,稱其為有數據壓縮的分組密碼;若n<m,明文分組長度小于密文分組長度,這稱之為有數據擴展的分組密碼;若n=m,明文分組長度等于密文分組長度,則稱之為無數據擴展和壓縮的分組密碼。事實上,通常的分組密碼均取為n=m
- 分組密碼的基本設計原則
- 分組長度足夠長,防止明文窮舉攻擊。
- 密鑰量足夠大,防止密鑰窮舉攻擊。
- 密鑰變換足夠復雜,攻擊者除了窮舉攻擊外找不到其它有效攻擊方法。
- 數據擴展足夠小,一般無數據擴展。
- 差錯傳播盡可能小,加密或解密某明文或密文分組出錯,對后續密文解密影響盡可能小。
- 分組密碼的實現設計原則
- 硬件實現原則
- 應該盡量使得加密和解密算法結構相同,僅僅密鑰使用方式不同,保證加密和解密采用同一密碼協處理器。
- 規則的編碼結構,適應于大規模集成電路實現,降低成本。
- 設計成迭代型,減少大規模集成電路實現時的硬件資源。
- 易于硬件實現的編碼結構。
- 軟件實現原則
- 加密和解密結構相似,便于加密和解密過程軟件實現可以方便調用子函數。
- 盡量使用既簡單又易于軟件實現的運算,例如加法、乘法、移位運算。
- 設計成迭代型。迭代型分組密碼有利于軟件實現中使用循環,代碼簡單。
- 密碼算法中盡量采用子塊運算,運算長度盡可能適應軟件編程,如8 bits、16 bits、32 bits或64 bits的單位長度。
- 硬件實現原則
- 分組密碼種類
- 分組密碼填充
- 例:
- 分組密碼的原理
- 迭代結構:
- 選擇某個較為簡單的密碼變換,在密鑰控制下以迭代方式多次利用它進行加密變換,就可以實現預期的擴散和混亂效果。(輪函數)
- 混淆:
- 是指在加密變換過程中是明文、密鑰以及密文之間的關系盡可能地復雜化,以防密碼破譯者采用統計分析法進行破譯攻擊。(線性ax+b=c/非線性ax^2+b=c)
- 擴散:
- 明文和密鑰中任何一比特值得改變,都會在某種程度上影響到密文值的變化,以防止將密鑰分解成若干個孤立的小部分,然后各個擊破。(擴散函數)
- 迭代結構:
- 代替-置換(S-P)網絡
- 對明文和子密鑰利用非線性代替S得到分組小塊混淆和擴展,再利用比特置換P錯亂非線性變換各輸出比特 。AES、SM4、SHARK等
- Feistel結構
- ?
- 特點:
- DES簡述
- DES是對稱密碼算法,加密、解密密鑰相同
- DES的明文分組為64比特,密鑰長度為64比特,有效密鑰長度為56比特,密文長度為64比特。
- DES加密,解密一共是16輪,每一輪需要用一個子密鑰,故一共要產生16個輪子密鑰,通常表示為K1,K2,K3, ……,K16.
- DES的加密和解密,從流程圖上和代碼上幾乎完全一致。只不過加密輸入的是明文和密鑰,解密輸入的是密文和密鑰。細節的差別在于,加密時使用的輪子密鑰是K1,K2, K3, ……,K16,而解密時使用的輪子密鑰是K16,K15, K14, ……,K1.換句話說,DES的16輪解密是其加密的每一輪的逆過程。
- 置換變換
- 置換位置改變,內容不變
- DES算法的整體結構—Feistel結構
- 給定明文,通過一個固定的初始置換IP來重排輸入明文塊P中的比特,得到比特串P0=IP(P)=L0R0,這里L0和R0分別是P0的前32比特和后32比特
- 初始變換
- 輪結構
- 按下述規則進行16次迭代,即1≤i≤16
- 這里⊕ 是對應比特的模2加,f是一個函數(稱為輪函數);16個長度為48比特的子密鑰Ki(1≤i≤16)是由密鑰k經密鑰編排函數計算出來的.最后一輪完成之后,還要進行一次左右交換!!!(切記)
- 對比特串R16L16使用逆置換IP-1得到密文C,即C=IP-1 (R16L16)。(注意L16和R16的相反順序)
- 逆初始變換
- IP和IP^-1之間的關系
- 給定明文,通過一個固定的初始置換IP來重排輸入明文塊P中的比特,得到比特串P0=IP(P)=L0R0,這里L0和R0分別是P0的前32比特和后32比特
- DES的輪函數
- 置換擴展變換
- 置換位置改變,長度擴展
- 例:
- 8比特二進制 0010 1001
- 第8位置換到第1位,第2位置換到第2,……,置換出結果:
- 0 11 0 0 01 0 0 0
- E盒置換擴展
- 壓縮替代S-盒
- S盒的選擇
- 置換P
- 置換擴展變換
- DES算法的密鑰編排算法
- 給定64比特密鑰K,根據固定的置換PC-1來處理K得到PC-1(K)=C0D0,其中C0和D0分別由最前和最后28比特組成
- 密鑰置換PC-1
- 左循環移位
- C0及D0根據左循環移位函數進行左循環移位1或2位,各輪移位位數如表所示。
- 置換選擇PC-1輸出的56位,分為兩半,
- C0=11101100 10011001 00011011 1011,
- D0=10110100 01011000 10001110 0110。
- C0及D0分別左循環1位得到
- C1=1101100 10011001 00011011 10111
- D1=0110100 01011000 10001110 01101
- 密鑰置換PC-2
- 子密鑰
- 通過PC-2置換選擇輸出的就是DES第1輪的子密鑰K1為001111 011000 111111 001101 001101110011 111101 001000,作為DES輪結構變換F函數的輸入
- 由前面的加密可知,DES加密一共是16輪,每一輪需要用一個子密鑰,故一共要產生16個輪子密鑰,通常表示為K1,K2, K3, ……,K16
- 給定64比特密鑰K,根據固定的置換PC-1來處理K得到PC-1(K)=C0D0,其中C0和D0分別由最前和最后28比特組成
- DES的解密變換
- DES的加密和解密,從流程圖上和代碼上幾乎完全一致。只不過加密輸入的是明文和密鑰,解密輸入的是密文和密鑰。
- 細節的差別在于,加密時使用的輪子密鑰是K1,K2, K3, ……,K16,而解密時使用的輪子密鑰是K16,K15, K14, ……,K1.
- 換句話說,DES的16輪解密是其加密的每一輪的逆過程。
- 2DES
- 一個密鑰有效長度56bit,兩個密鑰為56*2=112
- 有效密鑰長度112bits
- 一個密鑰有效長度56bit,兩個密鑰為56*2=112
- 三重DES -EEE3
- 個密鑰有效長度56bit,三個密鑰為56*3=168
- 有效密鑰長度168bits
- 個密鑰有效長度56bit,三個密鑰為56*3=168
- DES-EEE2
- 有效密鑰長度112bits
- DES-EDE2
- 密鑰長度112bits
- AES
- AES是Rijndael算法改進,分組長度128bits,密鑰長度則有三種:128/192/256bits
- 輪數與密鑰長度,明文分組長度的關系
- 現階段的AES(所學)均認為明文分組為128bits
- AES算法的整體結構
- AES的基本運算單位是字節(Byte),加密和解密過程都是在一個4×4的字節矩陣上運作,這個矩陣又稱為“體(state)”或者“狀態”。字節矩陣初始值是一個明文塊(塊/分組,block)
- 明文分組
- 狀態用以字節(8bits)為基本構成元素,每列4bytes數據,即為32bits。對于Rijndael算法,明文列數為分組長度除以32,通常記為Nb 。
- Nb=分組長度(bits)/32(bits)
- Rijndael算法列數Nb可以取的值為4、6、8,對應的明文分組長度為128、192、256bits。
- 而AES算法的分組長度固定為128bits,因此AES明文列數等于固定值Nb=4。
- 密鑰分組
- AES算法加密和解密過程中密鑰同樣以字節為單位進行計算,密鑰狀態矩陣也是4行,每列4bytes數據,即為32bits。因而密鑰列數記為Nk 。
- Nk=密鑰長度(bits)/32(bits)
- AES算法的密鑰長度的列數為128bits、192bits、256bits三種不同長度,因此不同密鑰長度Nk可以取值分別為4、6、8。
- AES算法的加密整體結構
- 明文初始狀態矩陣(state)
- AES算法中初始狀態矩陣由1組長度為128bits明文分組構成,以字節為單位,則總共有16bytes,從左到右開始,則前4個字節組成明文狀態矩陣第1列,依次后四個字節組成第2列,依次類推,AES算法明文分組可以構成一個4×4的初始字節狀態矩陣
- 密鑰初始矩陣
- AES算法的密鑰長度的列數為128\192\256bits三種不同長度,因此不同密鑰長度Nk(密鑰列數)以取值分別為4、6、8。
- 初始密鑰的列數編排類似明文初始狀態矩陣,因而密鑰構成一個4×4、4×6、4×8的密鑰字節矩陣。例如密鑰長度為192bits,以字節為單位,則總共有24bytes
- 輪密鑰加
- 字節代替(SubBytes)
- 字節變換(SubBytes)使用一個S盒,S盒是一個16×16的矩陣,如表所示。其非線性置換為:輸入的列的每個元素用來指定S盒的地址:前4位指定S盒的行,后4位指定S盒的列。行和列所確定S盒位置的元素取代輸入矩陣中相應位置的元素,例如“03”,行0,列3,因此輸入“03”,輸出“7B”。
- 例:
- 行移位(ShiftRows)
- 狀態陣列的4個行循環以字節為基本單位進行左移,而每行循環做移的偏移量是由明文分組的大小和所在行數共同確定,即列數Nb和行號確定。
- 例:
- 列混合(MixColumns)
- 基本運算(補充)
- 字節在 GF(2^8)的表示
- GF(2^8)上兩個域元素的加
- GF(2^8)上兩個域元素的乘
- GF(2^8)上域元素的乘x
- 因此可以得出若b7=0,可以得出.x·b(x)的結果就是b(x)對應的8bits 二進制向左移一位,最后一位補0.
- 因此可以得出若b7=1,可以得出.x·b(x)的結果就是b(x)對應的8bits 二進制向左移一位,最后一位補0,再與{1B}(其二進制為00011011,多項式表示為x*+x3+.x+1)做逐比特異或來實現.
- 例:
- 密鑰擴展
- Rijndael算法的密鑰同樣以字節為單位進行變換,用一個4行的二維矩陣來表示。密鑰按照矩陣的列進行分組,密鑰比特的總數等于明文分組長度乘以輪數加1,即密鑰比特的總數=明文分組長度×(輪數Round+1)
- 輪密鑰選取
- 輪密鑰i(即第i個輪密鑰)由輪密鑰緩沖字W[Nb*i]到W[Nb*(i+1)]給出:
- 三種拓展
- AES 的密鑰調度
- 密鑰調度包括兩個部分:密鑰擴展和輪密鑰選取。密鑰bit的總數=分組長度×(輪數Round+1)例如當分組長度為128bits和輪數Round為10時,輪密鑰長度為128×(10+1)=1408bits。將密碼密鑰擴展成一個擴展密鑰。從擴展密鑰中取出輪密鑰:第一個輪密鑰由擴展密鑰的第一個Nb個字(其實就是Nb列),第二個輪密鑰由接下來的Nb個字組成,以此類推。
- 解密
- 逆行移位
- 與加密時行移位相反,向右循環移位
- 逆列混合
- 與加密時行列混合運算過程一樣,固定矩陣改變
- 具體實例
- 現在我們來跟蹤AES加密算法的每一個迭代,以觀察所有操作對輸出影響。
- 假設加密的明文消息為128比特示例塊為十六進制為:80 5E 6A 36 53 25 3A 66 63 35 69 03 20 6C 28 06 16;初始密鑰也為128比特,十六進制表示為:75 35 6B 99 05 61 39 56 73 62 05 31 00 5509 32
- 首先,將128比特的明文塊寫成4×4的矩陣形式為:
- 逆行移位
- 分組密碼體制
- SM4算法
- 定義
- SM4(原名SMS4.0)是我國政府采用的一種分組密碼標準,由國家密碼管理局于2012年3月21日發布。相關標準為“GM/T 0002-2012《SM4分組密碼算法》(原SMS4分組密碼算法)”。
- 在商用密碼體系中,SM4主要用于數據加密,其算法公開,分組長度與密鑰長度均為128bit,加密算法與密鑰擴展算法都采用32輪非線性迭代結構,S盒為固定的8比特輸入8比特輸出。
- SM4算法的解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
- 算法原理
- 加密流程整體框圖
- SM4加密符號定義
- SM4的F輪函數
- SM4-S盒代替
- SM4算法中S盒代替與AES算法S盒代替類似,S盒的代替規則:輸入的前4位為行號,后4位為列號,行列交叉點處S盒列表中的數值為輸出(如表4-13),例如輸入“2a”,則行號為“2”,列號為“a”,根據表4-13,第2行第a列輸出值為“0b”,即Sbox(2a)=0b。
- SM4一輪加密實例
- SM4的加解密總結
- 1、SM4是對稱密碼算法,加密、解密密鑰相同
- 2、SM4的明文分組為128比特,密鑰長度為128比特,密文長度為128比特。
- 3、SM4加密,解密一共是32輪非線性迭代,然后再進行反序變換,輸出密文,每一輪需要用一個子密鑰,故一共要產生32個輪子密鑰,通常表示為
- 4、SM4的加密和解密,從流程圖上和代碼上幾乎完全一致。只不過加密輸入的是明文和密鑰,解密輸入的是密文和密鑰。
- 細節的差別在于,加密時使用的輪子密鑰是
- 而解密時使用的輪子密鑰是
- SM4密鑰編排算法
- 密鑰拓展算法
- 例:
- 定義
- SM4算法
- 典型的分組密碼體制
- IDEA基本概念
- IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密碼學中屬于數據塊加密算法(Block Cipher)類。IDEA使用長度為128bit的密鑰,數據塊大小為64bit。從理論上講,IDEA屬于“強”加密算法,至今還沒有出現對該算法的有效攻擊算法。
- IDEA是一個分組長度為64位的分組密碼算法,密鑰長度為128位(抗強力攻擊能力比DES強),同一算法既可加密也可解密。
- IDEA能抗差分分析和相關分析;IDEA似乎沒有DES意義下的弱密鑰;IDEA的“混淆”和“擴散”設計原則來自三種運算,它們易于軟、硬件實現(加密速度快)
- IDEA運算
- 實現上的考慮
- 使用子分組:16bit的子分組;
- 使用簡單操作(易于加法、移位等操作實現)
- 加密解密過程類似;
- 規則的結構(便于VLSI實現)。
- 實現上的考慮
- IDEA設計原理
- 3種運算結合起來使用可對算法的輸入提供復雜的變換,從而使得對IDEA的密碼分析比對僅使用異或運算的DES更為困難。
- 算法中擴散是由稱為乘加(multiplication/addition, MA)結構(見圖4.14)的基本單元實現的。
- 該結構的輸入是兩個16比特的子段和兩個16比特的子密鑰,輸出也為兩個16比特的子段。這一結構在算法中重復使用了8次,獲得了非常有效的擴散效果。
- IDEA的MA結構
- IDEA算法的擴散主要是由乘加結構的基本單元實現的。
- IDEA加密的總體方案
- IDEA加密過程
- 加密過程由連續的8輪迭代和一個輸出變換組成,算法將64比特的明文分組分成4個16比特的子段,每輪迭代以4個16比特的子段作為輸入,輸出也為4個16比特的子段。
- 最后的輸出變換也產生4個16比特的子段,鏈接起來后形成64比特的密文分組。
- 每輪迭代還需使用6個16比特的子密鑰,最后的輸出變換需使用4個16比特的子密鑰,所以子密鑰總數為52。圖4.15的右半部分表示由初始的128比特密鑰產生52個子密鑰的子密鑰產生器。
- IDEA第1輪的輪結構
- 根據IDEA第1輪的結構示意圖,以后各輪也都是這種結構,但所用的子密鑰和輪輸入不同。從結構圖可見,IDEA不是傳統的Feistel密碼結構。每輪開始時有一個變換,該變換的輸入是4個子段和4個子密鑰,變換中的運算是兩個乘法和兩個加法,輸出的4個子段經過異或運算形成了兩個16比特的子段作為MA結構的輸入。MA結構也有兩個輸入的子密鑰,輸出是兩個16比特的子段。
- 最后,變換的4個輸出子段和MA結構的兩個輸出子段經過異或運算產生這一輪的4個輸出子段。注意,由X2產生的輸出子段和由X3產生的輸出子段交換位置后形成W12和W13,目的在于進一步增加混淆效果,使得算法更易抵抗差分密碼分析。
- IDEA每一輪的加密順序
- 1. X1和第一個子密鑰相乘。
- 2. X2和第二個子密鑰相加。
- 3. X3和第三個子密鑰相加。
- 4. X4和第四個子密鑰相乘。
- 5. 將第1步和第3步的結果相異或。
- 6. 將第2步和第4步的結果相異或。
- 7. 將第5步的結果與第五個子密鑰相乘。
- 8. 將第6步和第7步的結果相加。
- 9. 將第8步的結果與第六個子密鑰相乘。
- 10.將第7步和第9步的結果相加。
- 11.將第1步和第9步的結果相異或。
- 12.將第3步和第9步的結果相異或。
- 13.將第2步和第10步的結果相異或。
- 14.將第4步和第10步的結果相異或。
- 算法的第9步是一個輸出變換,如圖4.17所示。它的結構和每一輪開始的變換結構一樣,不同之處在于輸出變換的第2個和第3個輸入首先交換了位置,目的在于撤銷第8輪輸出中兩個子段的交換。還需注意,第9步僅需4個子密鑰,而前面8輪中每輪需要6個子密鑰。
- IDEA的輸出變換
- IDEA子密鑰的產生
- 加密過程中52個16比特的子密鑰是由128比特的加密密鑰按如下方式產生的: 前8個子密鑰Z1,Z2,…,Z8直接從加密密鑰中取,即Z1取前16比特(最高有效位),Z2取下面的16比特,依次類推。然后加密密鑰循環左移25位,再取下面8個子密鑰Z9,Z10,…,Z16,取法與Z1,Z2,…,Z8的取法相同。這一過程重復下去,直到52子密鑰都被產生為止。
- 產生子密鑰的方法。這個算法用了52個子密鑰(8輪中的每一輪需要6個,其他4個用于輸出變換)。首先,將128-位密鑰分成8個16-位子密鑰。這些是算法的第一批8個子密鑰(第一輪6個,第二輪的頭2個)。然后,密鑰向左環移動25位產生另外8個子密鑰,如此進行直到算法結束。
- IDEA子密鑰
- IDEA的解密過程
- 加密解密實質相同,但使用不同的密鑰;
- 解密密鑰以如下方法從加密子密鑰中導出:
- 解密循環i的頭4個子密鑰從加密循環10-i的頭4個子密鑰中導出;解密密鑰第1、4個子密鑰對應于1、4加密子密鑰的乘法逆元;2、3對應2、3的加法逆元;
- 對前8個循環來說,循環i的最后兩個子密鑰等于加密循環9- i的最后兩個子密鑰;
- IDEA的解密過程
- IDEA基本概念
- RC5或RC6
- 背景
- RC5是由RSA公司的Rivest于1994年提出一種新型分組密碼。RC6是RSA公司提交給NIST的一個AES候選算法,它是在RC5的基礎上設計的.
- RC5的算法特性與許多算法不盡相同,它具有有可變的字長(因此輸入的分組長度是可變的),可變的加密輪數和可變的密鑰長度;只使用了微處理器上常實現,另一方面,由于沒有復雜的運算,它的加密速度非常快。
- RC5已經在RSA公司的許多產品應用,比如作為無線客戶端與服務器之間的加密算法。
- RC6是AES候選算法之一,由Rivest、Robshaw、Sidney和Yin提交的,它可能是最簡單的AES算法,RC6是RC5的進一步改進。像RC5那樣,RC6實際上是利用數據的循環移位。它的明文分組塊大小為128位,密鑰可以為128、192或256比特,共進行20輪的加密。
- Twofish算法
- Twofish 是counterpane 公司向NIST提交的一種滿足AES要求的加密算法,設計者為Schneier。
- Twofish 采用128位數據塊(128 bits block),128、192、256-bit 可變長度密鑰。
- Twofish 算法是進入NIST第二輪 5種加密算法中的一種,它同時具有RC6和Rijndael的某些特性,與DES算法一樣,使用了16輪的Feistel結構來加密明文,并應用了一些特殊的操作
- 背景
- ?
總結
以上是生活随笔為你收集整理的应用密码学(张仕斌)第四章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SD卡数据读取
- 下一篇: 软件测试的支付流程图,软件测试流程图案例