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