C中的三重des cbc加密
triple des cbc encryption in C
我如何使用 openssl
库通过 DES_ENCRYPT
在 c 中解密。
我发现了以下解密函数,当密钥长度为 8 字节时它工作正常!但是当我使用 16 字节的密钥时,结果是错误的值!
int CBC_3Des_Decrypt(char *data, char *okey)
{
DES_key_schedule ks;
DES_cblock ivec = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int i = 0;
int len = 0;
int nlen = 0;
unsigned char ch = '[=10=]';
unsigned char *ptr = NULL;
unsigned char src[16] = {0};
unsigned char dst[16] = {0};
unsigned char block[8] = {0};
ptr = hex2bin(okey, strlen(okey), &nlen);
memcpy(block, ptr, 8);
free(ptr);
DES_set_key_unchecked((const_DES_cblock*)block, &ks);
len = strlen((char *)data);
ptr = hex2bin(data, len, &nlen);
len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;
memcpy(src, ptr, len);
free(ptr);
ch = 8 - nlen % 8;
memset(src + nlen, ch, 8 - nlen % 8);
for (i = 0; i < len; i++) {
TRACE(("%.2X", *(src + i)));
}
DES_ncbc_encrypt(src, dst, sizeof(src), &ks, &ivec, DES_DECRYPT);
for (i = 0; i < len; i++) {
TRACE(("%.2X", *(dst + i)));
}
return 0;
}
我如何使用带有 16 字节密钥的库解密或加密?
您正在调用的 (DES_ncbc_encrypt
) 是 DES 算法,而不是 3DES。我怀疑你是想打电话给 DES_ede3_cbc_encrypt
.
重要的是不要混淆 DES 和 3DES ("triple DES")。它们是相关的算法,但并不相同。在OpenSSL内部,3DES一般称为EDE3。 EDE3 是一种实现三重 DES 的特定方式(并且是每个人都使用的方式,因此在实践中它们通常是同义词)。
我如何使用 openssl
库通过 DES_ENCRYPT
在 c 中解密。
我发现了以下解密函数,当密钥长度为 8 字节时它工作正常!但是当我使用 16 字节的密钥时,结果是错误的值!
int CBC_3Des_Decrypt(char *data, char *okey)
{
DES_key_schedule ks;
DES_cblock ivec = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int i = 0;
int len = 0;
int nlen = 0;
unsigned char ch = '[=10=]';
unsigned char *ptr = NULL;
unsigned char src[16] = {0};
unsigned char dst[16] = {0};
unsigned char block[8] = {0};
ptr = hex2bin(okey, strlen(okey), &nlen);
memcpy(block, ptr, 8);
free(ptr);
DES_set_key_unchecked((const_DES_cblock*)block, &ks);
len = strlen((char *)data);
ptr = hex2bin(data, len, &nlen);
len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;
memcpy(src, ptr, len);
free(ptr);
ch = 8 - nlen % 8;
memset(src + nlen, ch, 8 - nlen % 8);
for (i = 0; i < len; i++) {
TRACE(("%.2X", *(src + i)));
}
DES_ncbc_encrypt(src, dst, sizeof(src), &ks, &ivec, DES_DECRYPT);
for (i = 0; i < len; i++) {
TRACE(("%.2X", *(dst + i)));
}
return 0;
}
我如何使用带有 16 字节密钥的库解密或加密?
您正在调用的 (DES_ncbc_encrypt
) 是 DES 算法,而不是 3DES。我怀疑你是想打电话给 DES_ede3_cbc_encrypt
.
重要的是不要混淆 DES 和 3DES ("triple DES")。它们是相关的算法,但并不相同。在OpenSSL内部,3DES一般称为EDE3。 EDE3 是一种实现三重 DES 的特定方式(并且是每个人都使用的方式,因此在实践中它们通常是同义词)。