5

我有解码 AES 256 字符串的函数,但它只返回 16 个字符

bool decrypt_block(unsigned char* cipherText, unsigned char* plainText, unsigned char* key)
{
    AES_KEY decKey;
    if (AES_set_decrypt_key(key, 256, &decKey) < 0)
        return false;
    AES_decrypt(cipherText, plainText, &decKey);
    return true;
}

decrypt_block( encoded, resultText, ( unsigned char *) "57f4dad48e7a4f7cd171c654226feb5a");

任何想法

4

2 回答 2

5

您似乎混淆了密钥长度和块大小。

AES 可用于 3 种不同的密钥长度:128 位、192 位和 256 位。

AES 始终使用 128 位(16 字节)的块大小。对于长度超过 16 个字节的消息,您需要一次解密(或加密)16 个字节,并期望每次得到 16 个字节的输出。(您还需要决定使用哪种模式 - 例如 CBC、CTR、ECB 等。如果您正在解密其他人提供的文本,则该决定已经为您做出。如果您自己做出决定,请承担请记住,ECB 几乎从来都不是正确的选择。)如果消息的长度不是 16 字节的倍数,则需要对其进行填充。PKCS #7 填充是最常见的。

有关更多信息,请参阅有关 AES 的 Wikipedia 文章

于 2015-01-06T10:14:33.017 回答
4

AES 是一种分组密码。它加密和解密一个 128 位(16 字节)的块。AES_decrypt 和 AES_encrypt 一次作用于单个块。所以,你只会得到前 16 个字节。您必须手动解密或加密其他块。

如果您知道模式(如 CBC、ECB 等),则可以调用 AES_decrypt_cbc 等函数。

您需要修改代码如下(我只是举个例子):

 int len = strlen(ciphertext); //or get cipher text length by any mean.
 int i;
 for(i=0; i<=len; i+=16)
    AES_decrypt(cipherText+i, plainText+i, &decKey);

如果您确定模式,请调用 cbc/ecb/cfb/​​ofb 模式函数。

如有任何疑问,请告诉我。

于 2013-03-13T04:19:28.470 回答