2013-03-13 404 views
4

我有功能解码AES 256字符串,但它仅返回16字符AES ECB加密/解密只解密前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"); 

任何想法

+1

你应该*不*使用'AES_encrypt'和朋友。您应该使用'EVP_ *'功能。请参阅OpenSSL wiki上的[EVP Symmetric Encryption and Decryption](https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)。事实上,您应该使用经过身份验证的加密,因为它提供了*机密性和真实性。请参阅OpenSSL wiki上的[EVP Authenticated Encryption and Decryption](https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)。 – jww 2015-05-15 20:45:51

回答

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

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

+0

错误C2664:'strlen':无法将参数1从'unsigned char *'转换为'const char *' – user956584 2013-03-13 14:31:36

+0

确定其工作:---- strlen((const char *)cipherText); --- – user956584 2013-03-13 14:37:05

+0

你的问题现在解决了吗? – doptimusprime 2013-03-14 04:18:44

3

看起来你正在混淆密钥长度和块大小。

AES可以使用3个不同的密钥:128位,192位& 256位。

AES始终使用128位(16字节)的块大小。对于长度超过16字节的消息,您需要一次解密(或加密)16个字节,并且每次都要获得16个字节的输出。 (你还需要决定使用哪种模式 - 例如CBC,CTR,ECB等等。如果你解密别人提供的文本,那么这个决定已经被你采纳了。如果你为自己做出决定,承担请记住,欧洲央行几乎从来都不是正确的选择。)如果消息不是16字节长的倍数,则需要pad it。 PKCS#7填充是最常见的。

查看Wikipedia article on AES了解更多信息。