AES ECB加密/解密仅解密前16个字节

我有解码AES 256字符串的function,但它只返回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"); 

任何的想法

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模式函数。

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

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

AES可以使用3种不同的密钥长度 :128位,192位和256位。

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

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