DES cbc是基於數據塊加密的。數據塊的長度為8字節64bit。以數據塊為單位循環加密,再拼接。每個數據塊加密的秘鑰一樣,IV向量不同。第一個數據快所需的IV向量,需要我們提供,從第二個數據塊開始,所需的IV向量為上一個數據塊生成的密文。
IV向量該怎么賦值, 它跟秘鑰KEY有什么關系,這一點,我暫時不清楚,如果您知道,請留言講一下,非常感謝。我知道的是java里頭調用庫只傳了一個KEY參數,工作經驗認知是,java默認IV向量跟秘鑰KEY是一樣的值。
DES加密的填充方式有多種,分別是 ansix923、iso10126、zeropadding、pkcs5padding、pkcs7padding。 那么cbc模式加密的填充方式也不例外。然而,解密的過程,只需要把密文分割成8字節一塊,循環解密再做拼接。
C++可調用openssl庫實現DES加解密。但是openssl提供的接口只滿足對一個數據塊8個字節的加解密,實際使用,需要自己實現不同的填充方式。
openssl庫加密的結果是不可識別的二進制字符串,需要轉為可識別的十六進制或者Base64格式。
因為工作中用到三種,下面對三種填充方式做簡單講解。
一、zeropadding
如果明文正好是8字節整數倍長度,則不需填充。如果明文不是8字節整數倍長度,則最后一部分,不足8字節,用0填充。
12345678 ----->> 12345678
12345678 12345678 ----->> 12345678 12345678
12345678 91 ----->> 12345678 91000000
12345678 9123 ----->>12345678 91230000
二、pkcs5padding
如果明文正好是8字節整數倍長度,則不需填充。如果明文不是8字節整數倍長度,則最后一部分,剩余m字節,差n=(8-m)字節,用n填充
12345678 ----->> 12345678
12345678 12345678 ----->> 12345678 12345678
12345678 91 ----->> 12345678 91777777
12345678 9123 ----->> 12345678 91234444
三、pkcs7padding
同pkcs5padding
附1:C++調用openssl庫實現的DES加密解密完整代碼
附2:C++二進制字符串轉十六進制字符串 C++十六進制字符串轉二進制字符串
附3:C++二進制字符串轉Base64字符串 C++Base64字符串轉二進制字符串 C++base64格式和nonSafeBase64格式轉換
附4:C++ 使用openssl庫實現 DES 加密——CBC模式 && RSA加密——公加私解——私加公解