【问题标题】:triple des cbc encryption in CC中的三重des cbc加密
【发布时间】:2018-04-29 14:55:35
【问题描述】:

我如何使用openssl 库在c 中通过DES_ENCRYPT 解密。 我找到了以下解密函数,当密钥长度为 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 = '\0';
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 字节密钥的库进行解密或加密?

【问题讨论】:

    标签: c encryption openssl 3des


    【解决方案1】:

    您拨打的电话 (DES_ncbc_encrypt) 是 DES 算法,而不是 3DES。我怀疑你是想打电话给DES_ede3_cbc_encrypt

    不要混淆 DES 和 3DES(“三重 DES”),这一点很重要。它们是相关的算法,但不一样。在 OpenSSL 内部,3DES 通常称为 EDE3。 EDE3 是实现三重 DES 的一种特定方式(并且是每个人都使用的方式,因此在实践中它们通常是同义词)。

    【讨论】:

    • 有时根据密钥大小在加密 API 中选择单 DES 和三重 DES。如果密钥只是作为内存中的指针提供,那当然不适用于 C。仅指针的缺点是您也不会得到任何错误。如果在托管语言(Java、C# 等)中使用了键 object,如果键的大小与算法不匹配,则会出现运行时异常。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多