Установить отступ в OpenSSL для AES_ecb_encrypt

Я расшифровываю некоторый зашифрованный текст Java с OpenSSL. Читая этот пост, я написал следующий код.

unsigned int i = 0;
printf("Out array - Before\n");
for(i = 0; i < sizeof(out); i++) {
    if(i % 32 == 0)
        printf("\n");
    printf("%02X", out[i]);
}
printf("\n");

AES_set_decrypt_key((const unsigned char *)a.at(3).c_str(), 128, &aesKey_);
for(i = 0; i < sizeof(bytes); i += AES_BLOCK_SIZE) {
    std::cout << "Decrypting at " << i << " of " << sizeof(bytes) << "\n";
    AES_ecb_encrypt(bytes + i, out + i, &aesKey_, AES_DECRYPT);
}

std::cout << "HEX        : " << a.at(2).c_str() << "\n"
<< "Decrypting : " << bytes << "\n"
<< "With Key   : " << a.at(3).c_str() << "\n"
<< "Becomes    : " << out << "\n";

printf("Out array - AFTER\n");
for(i = 0; i < sizeof(out); i++) {
    if(i % 32 == 0)
        printf("\n");
    printf("%02X", out[i]);
}
printf("\n");

Похоже, что расшифровать данные в порядке, хотя PKCS5-padding расшифровывается вместе и некоторый дополнительный мусор (я предполагаю, что это из-за PKCS5-padding).

Out array - BEFORE 0000000000000000000000000000000000000000000000000000000000000000
Decrypting at 0 of 18
Decrypting at 16 of 18
HEX        : B00FE0383F2E3CBB95A5A28FA91923FA00
Decrypting : ��8?.<������#�
With Key   : I'm a secret key
Becomes    : no passwordHQ�EZ��-�=%.7�n
Out array - AFTER 6E6F2070617373776F72644851030303C7457F5ACCF12DAA053D252E3708846E

Выше приведен вывод из моего кода, no passwordHQ (6E6F2070617373776F72644851) - ожидаемый результат, но вы можете видеть, что отступы декодируются 030303 сопровождаемый мусором C7457F5ACCF12DAA053D252E3708846E,

Так как мне установить отступы в OpenSSL?

Я ожидал, что будет AES_set_padding (или похожая) функция, но я явно пропускаю ее в документации.

1 ответ

Пожалуйста, попробуйте использовать функцию более высокого уровня, определенную в EVP_ *. Для этих функций дополнение PKCS#7 является стандартным. Обратите внимание, что официальное заполнение PKCS#5 только для 8-байтовых блочных шифров.

После некоторых поисков я обнаружил, что evp.h должен содержать:

const EVP_CIPHER *EVP_aes_128_ecb(void);

который вы должны быть в состоянии использовать с

int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
     unsigned char *key, unsigned char *iv);

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

Другие вопросы по тегам