OpenSSL 3des с C ++ - PullRequest
       49

OpenSSL 3des с C ++

2 голосов
/ 26 июня 2019

Я хочу использовать библиотеку openssl в C++ для расшифровки данных.

У меня есть ключ, IV и закодированная строка base64.

Я не смог пройти через документацию, все методы расшифровки в заголовочном файле (openssl/des.h) требуют 3 ключа.

Мне удалось добиться результата с помощью следующего кода Python.

from pyDes import *
import base64

key = base64.b64decode("****")
iv = base64.b64decode("***")
enc = base64.b64decode("******")
encryptor = triple_des(key, CBC, iv)
plain = encryptor.decrypt(enc)
print(plain.decode("utf-8"))

Я хочу получить тот же результат, используя код C ++ и библиотеку OpenSSL.

1 Ответ

1 голос
/ 26 июня 2019

3DES использует три клавиши.Используемая вами функция python, вероятно, получает три ключа из передаваемого аргумента ключа, возможно, разделяя его на три части.

Чтобы использовать функцию OpenSSL, вы должны сгенерировать 3 ключа по 8 байт каждый (или 24ключ байтов разделен на 3).

Я адаптировал код, который нашел здесь , чтобы использовать ECB вместо CBC.Но по соображениям безопасности вы должны рассмотреть возможность использования CBC или даже шифрования AES вместо 3DES.

В примере показано только использование функции DES_ecb3_encrypt с жестко закодированными ключами.В конечном решении вы должны сгенерировать свои собственные ключи, используя хороший RNG.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/des.h>

/* Triple DES key for Encryption and Decryption */
DES_cblock Key1 = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
DES_cblock Key2 = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
DES_cblock Key3 = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 };
DES_key_schedule SchKey1,SchKey2,SchKey3;

/* Print Encrypted and Decrypted data packets */
void print_data(const char *tittle, const void* data, int len);

int main()
{
    /* Input data to encrypt */
    DES_cblock input_data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x6, 0x7, 0x8};

    /* Check for Weak key generation */
    if ( -2 == (DES_set_key_checked(&Key1, &SchKey1) || DES_set_key_checked(&Key2, &SchKey2) || DES_set_key_checked(&Key3, &SchKey3)))
    {
        printf(" Weak key ....\n");
        return 1;
    }

    /* Buffers for Encryption and Decryption */
    DES_cblock cipher;
    DES_cblock text;

    /* Triple-DES ECB Encryption */
    DES_ecb3_encrypt(&input_data, &cipher, &SchKey1, &SchKey2, &SchKey3, DES_ENCRYPT);

    /* Triple-DES ECB Decryption */
    DES_ecb3_encrypt(&cipher, &text, &SchKey1, &SchKey2, &SchKey3, DES_DECRYPT);

    /* Printing and Verifying */
    print_data("\n Original ", (const void*) input_data, sizeof(input_data));
    print_data("\n Encrypted", (const void*) cipher, sizeof(input_data));
    print_data("\n Decrypted", (const void*) text, sizeof(input_data));

    return 0;
}
void print_data(const char *tittle, const void* data, int len)
{
    printf("%s : ",tittle);
    const unsigned char * p = (const unsigned char*)data;
    int i = 0;

    for (; i<len;++i)
        printf("%02X ", *p++);

    printf("\n");
}

Ссылка OpenSSL :

void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, 
        DES_key_schedule *ks1, DES_key_schedule *ks2, 
        DES_key_schedule *ks3, int enc);

DES_ecb3_encrypt () шифрует / дешифрует входной блок с использованием трехключевого шифрования Triple-DES в режиме ECB.Это включает в себя шифрование ввода с помощью ks1, дешифрование с помощью расписания ключей ks2, а затем шифрование с помощью ks3.Эта процедура значительно снижает вероятность взлома DES методом «грубой силы» и имеет преимущество в том, что если ks1, ks2 и ks3 одинаковы, это эквивалентно простому шифрованию с использованием режима ECB и ks1 в качестве ключа.

...