在OpenSSL中为AES_ecb_encrypt设置填充

时间:2013-11-06 11:03:39

标签: cryptography openssl aes pkcs#5

我正在使用OpenSSL解密一些Java加密文本。阅读this post我写了下面的代码。

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 passwordHQ6E6F2070617373776F72644851)是预期输出,但您可以看到填充已解码030303后跟垃圾C7457F5ACCF12DAA053D252E3708846E

那么如何在OpenSSL中设置填充?

我希望有一个AES_set_padding(或类似的)函数,但我在文档中显然没有它。

1 个答案:

答案 0 :(得分:0)

请尝试使用EVP_*中定义的更高级别功能。对于这些功能,PKCS#7填充是标准的。请注意,PKCS#5填充正式仅为for 8 byte block ciphers

经过一番搜索,我发现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功能的其他信息确实表明它会自动使用正确的填充。当然,对于ECB模式,IV被忽略,因此任何指针都应该这样做。