тройное шифрование CBC в C - PullRequest
0 голосов
/ 29 апреля 2018

Как я могу расшифровать DES_ENCRYPT в c, используя библиотеку openssl. Я нашел следующую функцию для расшифровки, и она работала нормально, когда длина ключа составляет 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-байтовым ключом?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы звоните (DES_ncbc_encrypt) - это алгоритм DES, а не 3DES. Я подозреваю, что вы хотели позвонить DES_ede3_cbc_encrypt.

Важно не путать DES и 3DES («тройной DES»). Это связанные алгоритмы, но не одинаковые. Внутри OpenSSL 3DES обычно называется EDE3. EDE3 - это особый способ реализации Triple DES (который используется всеми, поэтому на практике они обычно являются синонимами).

...