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格式转换