參考鏈接
- Linux加密框架中的算法和算法模式(二)_家有一希的博客-CSDN博客
對稱算法 分組算法模式
ECB模式
- ECB模式下,明文數據被分為大小合適的分組,然后對每個分組獨立進行加密或解密
- 如下圖所示
- ?如果兩個明文塊相同,則加密輸出相同的密文塊
- ECB模式的優點在于操作簡單,易于實現。由于分組的獨立性,利于實現并行處理,并能很好地防止誤碼擴散。由于所有分組的加密方式一致,明文中重復內容(即模式)會在密文中有所體現,因此難以抵抗統計分析攻擊。
- ECB模式一般用于小數據量的字符信息的安全性保護,例如密鑰保護。加密框架支持分組算法的ECB模式,實現源碼為ecb.c
- ecb.c - crypto/ecb.c - Linux source code (v5.15.11) - Bootlin
CBC模式
- 1976年,IBM發明了密碼分組鏈接(CBC,cipher-block chaining)模式。在該模式中,每個明文塊先與前一個密文塊進行異或后,再進行加密
- 如下圖所示
?
- 如上圖所示,每個密文塊都依賴于它前面所有的明文塊,同時為保證每條消息的唯一性,在第一個塊中需要使用初始向量IV。若第一個塊的下標為1,則CBC模式的加密過程為Ci=Ek(Pi⊕Ci-1),C0=IV,而其解密過程為Pi=Dk(Ci)⊕Ci-1,C0=IV,其中Pi表示第i個明文塊,Ci表示第i個密文塊,E和D分別為加密器和解密器,k為密鑰。
- CBC模式的主要缺點在于加密過程是串行的,無法被并行化,而且明文數據必須被填充到塊大小的整數倍。加密時,明文中的微小改變會導致全部密文塊都發生變化(即誤碼擴散)。解密時,從兩個鄰接的密文塊即可得到一個明文塊,因此解密過程可以被并行化,而解密時密文中一位的改變只會導致其對應的明文塊完全改變和下一個明文塊中對應位發生改變,不會影響到其他明文塊的內容。
- 加密框架支持分組算法的CBC模式,實現源碼為cbc.c。?
- cbc.c - crypto/cbc.c - Linux source code (v5.15.11) - Bootlin
CTR模式
- CTR(Counter,計數器)模式將塊密碼變為流密碼,通過一個遞增的加密計數器以產生連續的密碼流,其中計數器可以是任意保證不產生長時間重復輸出的函數,使用要給普通的計數器是最簡單和最常見的做法。
- 采用普通計數器的CTR加密流程如下所示。?
- 圖中Nonce(隨機數)和計數器可以通過級聯、相加或異或等運算使得相同的明文產生不同的密文。
- CTR模式被廣泛用于ATM網絡安全和IPSEC應用中,與其他模式相比,具有以下特點:
- 1)高效率,允許進行并行計算,可以很好地應用CPU流水等并行技術;
- 2)隨機訪問,可以隨機地對任意一個密文分組進行解密,對該密文的處理與其他密文無關;
- 3)簡單性,與其他模式不同,CTR模式僅要求實現加密算法,但不要求實現解密算法。對AES等加解密本質上不同的算法來說,這種簡化是巨大的。
- 4)預處理,算法和加密器的輸出不依賴于明文和密文的輸入,因此如果有足夠的保證安全的存儲器,加密算法將僅僅是一系列異或運算,極大地提高吞吐量。
- 5)無填充,可以高效地作為流密碼使用。
- 加密框架支持分組算法的CTR模式,實現源碼為ctr.c。?
- ctr.c - crypto/ctr.c - Linux source code (v5.15.11) - Bootlin
PCBC模式
- PCBC(Propagating Cipher Block Chaining,填充密碼塊鏈接)模式,是一種可以使密文的微小改動在解密時導致明文大部分錯誤的模式,并在加密時也具有相同的特性。
- PCBC模式的加密流程如下所示。
?
- ?PCBC模式的加解密算法描述如下:
- 1)加密算法:Ci=Ek(Pi⊕Pi-1⊕Ci-1),P0⊕C0=IV,i=1,2,…,n。
- 2)解密算法:Pi=Dk(Ci)⊕Pi-1⊕Ci-1, P0⊕C0=IV,i=1,2,…,n。
- 對于使用PCBC模式加密的消息,互換兩個鄰接的密文塊,不會對后續塊的解密產生影響。
- 加密框架支持分組算法的PCBC模式,實現源碼為pcbc.c。
- 注:PCBC模式或稱為明文密碼塊鏈接(Plaintext Cipher Block Chaining)模式。
- pcbc.c - crypto/pcbc.c - Linux source code (v5.15.11) - Bootlin
CCM模式
- CCM(Counter with CipherBlock Chaining-Message Authentication Code)模式是一種同時提供加密服務和認證服務的算法模式,其中加密服務由CTR模式提供,認證服務由CBC-MAC模式提供。
- CCM模式融合了CTR模式和CBC-MAC模式的優點。
- 使用CCM模式的基本條件包括分組算法E、密鑰K、計數器發生函數C(Counter Generation Function)、格式化函數F(Formating Function)和認證數據Tag、長度Tlen。
- 在發送方,CCM模式的輸入包括隨機值N、有效載荷P和附加數據A,計算步驟如下所述:
- 1)執行格式化函數F(N,A,P),產生128bit/塊的數據塊序列B0、B1、…、Br。
- 2)對數據B(B=B0||B1||…||Br)計算CBC-MAC值T,認證數據長度為Tlen。
- 3)執行計數器發生函數C,產生128bit/塊的計數器塊ctr0、ctr1、…、ctrm,其中m=PLen/128,按照CTR模式計算Sj=Ek(ctrj)(j=0,1,…,m),再計算有效載荷P的密文C’=P⊕MSBplen(S),其中S=S1||S2||…||Sm。
- 4)按如下公式計算CCM模式輸出密文C=C’||(T⊕MSBtlen(S0))。
- 當接收方接收到N、A和C時,對密文C首先進行解密得到有效載荷T和CBC-MAC值T,然后再對N、A、P計算CBC_MAC值T‘。如果T’=T說明認證通過,表示接收方從密文中解密得到的有效載荷P是真實有效的,否則表示得到的有效載荷P是無效的。
- CCM模式的認證流程和加密流程如下所示。
- 1)認證流程
- ?2)加密流程
- 加密框架支持分組算法的CCM模式,實現源碼為ccm.c。
- 在ccm.c中,除支持標準的CCM模式(記為ccm)外,還支持基本的CCM模式(記為ccm_base)和基于RFC4309的CCM模式(記為rfc4309,即CCM(AES))。
- ccm和ccm_base兩種CCM模式的區別在于輸入參數和衍生算法的算法命名,ccm只需要一個輸入參數,即基礎算法名cipher_name,然后構造出CTR模式算法(即ctr(cipher_name))和CCM模式算法(即ccm(cipher_name))
- 而ccm_base的輸入參數除基礎算法名cipher_name外還包括CTR模式算法名ctr_name,構造出的CCM算法名為ccm_base(ctr_name,cipher_name)。
- 注:RFC4309:Using Advanced Encryption Standard(AES) CCM Mode with IPSEC Encapsulating Security Payload(ESP)。?
- ccm.c - crypto/ccm.c - Linux source code (v5.15.11) - Bootlin
GCM
- 同CCM模式,GCM模式(Galois/Counter Mode)也是一種同時提供加密服務和認證服務的算法模式,其中加密服務由CTR模式提供,認證服務由定義在伽羅華(Galois)域內的泛散Hash函數提供。GCM模式是建立在128比特分組密鑰基礎上的。
- 加密框架支持分組算法的GCM模式,實現源碼為gcm.c。同CCM模式相同,gcm.c中定義了標準GCM模式(記為gcm)、基礎GCM模式(記為gcm_base)和基于RFC4106的GCM模式(記為rfc4106)共三種不同GCM模式。
- 注:RFC4106:The use of Galios/Counter Mode(GCM) in IPSEC Encapsulating Security Payload(ESP)。?
- gcm.c - crypto/gcm.c - Linux source code (v5.15.11) - Bootlin
CTS模式
- CTS模式(Cipher Text Stealing Mode,密文竊取模式)可以處理任意長度的明文,產生與明文相匹配的密文。CTS模式除明文的最后兩個塊外的其他塊的處理方式與CBC模式相同。
- 將明文的最后開兩個塊為Pn-1和Pn,其中Pn-1的長度等于塊長度BB,Pn的長度Ln為1到BB的任意值,處理流程如下所示。
- 1)Xn-1=Pn-1⊕Cn-2,其中Cn-2為Pn-1前一個塊Pn-2對應的密文;
- 2)En-1=Ek(Xn-1),Cn=MSBln(En-1);
- 3)在Pn末尾填充0創建長度為BB的Pn’;
- 4)Dn=En-1⊕Pn’,Cn-1=Ek(Dn)。
- 經過上述計算得到明文最后兩個塊Pn-1和Pn的密文Cn-1和Cn。
- 加密框架支持分組算法的CTS模式,實現源碼為cts.c。?
- cts.c - crypto/cts.c - Linux source code (v5.15.11) - Bootlin
?LRW模式
- LRW模式采用可調分組密碼模塊,曾經是IEEE P1619窄塊加密標準候選算法模式中最有希望的。由于使用非鏈式結構,因此LRW模式可以有效支持并行操作。
- 除明文和密鑰外,LRW模式還有第3個輸入,叫擾亂因子,其作用非常類似于CBC模式中的初始向量,但具有易變性。根據定義,可調分組密碼應該具有改變擾亂因子的性能,這樣比更換密鑰更有效率。
- 加密框架支持分組算法的LRW模式,實現源碼為lrw.c。
- lrw.c - crypto/lrw.c - Linux source code (v5.15.11) - Bootlin
XTS模式
- XTS模式是基于XEX的密文竊取可調密碼模塊,被認為是當前最適合于磁盤加密的窄塊加密模式,已經被IEEE P1619標準采用。
- 加密框架支持分組算法的XTS模式,實現源碼為xts.c。?
- xts.c - crypto/xts.c - Linux source code (v5.15.11) - Bootlin
CMAC模式
- 除HMAC外,還有一種廠家的MAC運算,即CMAC。CMAC全稱為Cipher-based MAC,即基于AES等對稱加密方式實現的消息認證。最常見的CMAC是基于分組密碼的CBC模式構造的MAC,即CBC-MAC,被很多國際組織和結構定為標準,如標準ANSI X9.9,FIPS PUB 113和ISO/IEC 9797,是金融貿易中使用最為廣泛的消息認證碼。
- 由于CBC模式加密時,當改變一個明文分組時,其對應密文分組及氣候的密文分組都會受到影響,這一性質使CBC模式能被用來產生一個消息認證碼,它能使消息接收方相信給定的明文序列的確來自合法的發送者,而沒有被篡改。
- CMAC共使用三條密鑰,一個位長為k的加密密鑰,用于密文分組鏈接的每一步,兩個位長為n的密鑰,分別用于滿分組和不滿分組的最后一個明文分組的處理。兩個位長為n的密鑰可以從加密密鑰導出,無需單獨提供。
- 滿分組時CMAC計算流程:
?
- 不滿分組時CMAC計算流程:?
- 注:CMAC于2005年通過NIST認證。
- cmac.c - crypto/cmac.c - Linux source code (v5.15.11) - Bootlin
XCBC模式
- XCBC模式(Extend Cipher Block Chaining Mode)由美國學者John Black和Phillip Rogaway于2000年提出的,作為CBC模式的擴展,已被美國政府采納為標準。
- XCBC模式和CBC模式的區別在于最后一個數據塊的處理方式不同,XCBC模式不像CBC模式要求最后一個數據塊必須是整塊,也可以是短塊。XCBC模式具有CBC模式的所有優缺點。
- 加密框架支持分組算法的XCBC模式,實現源碼為xcbc.c,但不是作為一種分組加密模式,而是用來構造MAC,即XCBC-MAC。
- xcbc.c - crypto/xcbc.c - Linux source code (v5.15.11) - Bootlin?
?哈希算法模式
HMAC模式
- MAC(Message Authentication Code)是一種保障信息完整性和認證的密碼學方法,其中HMAC(Hash-based MAC)是密鑰相關的哈希運算消息認證碼。
- HMAC運算利用哈希算法,以一個密鑰和一個消息作為輸入,生成一個消息摘要作為輸出。
- 定義HMAC需要一個哈希函數H(如MD5或SHA1)和一個密鑰K,哈希函數的分割數據長度記為B(單位字節,MD5和SHA1的B為64),輸出摘要長度記為L(單位字節,MD5的L為16,SHA1的L為20)。密鑰K的長度可以是小于等于數據塊長度B的任意值,如果密鑰K的長度大于B,不能直接使用,而是將密鑰K的哈希值(即H(K))作為HMAC運算的密鑰使用。一般情況下,密鑰K的最小推薦值長度為L個字節。
- HMAC運算表達式為HMAC(K,M)=H((K’⊕opad)||H((K’⊕ipad)||M)),其中⊕表示異或運算,||表示級聯運算,M為一個輸入消息,opad為與數據塊等長的0x5C,ipad為與數據塊等長的0x36,K’為密鑰K以0x00填充的與數據塊等長的字符串。
- HMAC運算步驟如下所示:
?
- 1)在密鑰K后填充0x00來創建一個字長為B的字符串K’,如密鑰K的字長為20個字節,B為64字節,則在K后填充44個0x00;
- 2)將K’與ipad作異或運算,得到K’’;
- 3)將K’‘與輸入消息M作級聯運算,即將輸入消息M添加到K’‘后組成新的字符串M’;
- 4)計算M’的哈希值,即H1=H(M’);
- 5)將K’與opad作異或運算,得到K’’’;
- 6)將K’’‘與H1作級聯運算,得到M’’;
- 7)計算M’‘的哈希值,即H2=H(M’’)。
- H2即為輸入消息M與密鑰K相關的哈希值,即HMAC值。
- 加密框架支持哈希算法的HMAC模式,實現源碼為hmac.c。
- 注:HMAC于2002年通過NIST認證。
- hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin
VMAC
- VMAC模式是基于塊密碼構造的MAC算法,由Ted Krovetz和Wei Dai于2007年提出。VMAC模式的設計初衷為在64位機中保證良好的運算性能,但在32位機上也有很好的運算性能。
- 于其他MAC(如HMAC、CMAC)模式不同,VMAC模式除消息的MAC值外還包括一個偽隨機數pad,因此除需要一個帶密鑰的哈希函數H外還需要一個偽隨機函數F。
- VMAC模式的計算公式為Tag=Hk1(M)+Fk2(Nonce),其中K1和K2為收發雙方共享的密鑰。
- 加密框架支持哈希算法的VMAC模式,實現源碼為vmac.c。
- vmac.c - crypto/vmac.c - Linux source code (v5.15.11) - Bootlin