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