AES_decrypt不起作用

时间:2017-07-27 04:12:25

标签: openssl aes

我正在尝试下面的代码,但输出不是预期的。

uint8_t ss_key[32];
uint8_t enc_out[80];
AES_KEY enc_key, dec_key;
uint8_t data[32]="YOGENDRASINGHHGNISARDNEGOY12345";
uint8_t data_out[32];

memset(data_out,0,sizeof(data_out));
if (!RAND_bytes(ss_key, sizeof(ss_key))) {
    cout<<"error random value"<<endl;
}

AES_set_encrypt_key(ss_key, 128, &enc_key);
AES_set_decrypt_key(ss_key, 128, &dec_key);
AES_encrypt(data, enc_out, &enc_key);
AES_decrypt(enc_out, data_out, &dec_key);

cout<<data<<endl;
cout<<"reverse"<<endl;

for(int i=0;i<32;i++){
    cout<<data_out[i];
}

输出:

YOGENDRASINGHHGNISARDNEGOY12345

reverse

YOGENDRASINGHHGN

1 个答案:

答案 0 :(得分:1)

  

YOGENDRASINGHHGNISARDNEGOY12345

     

逆转

     

YOGENDRASINGHHGN

AES_encrypt仅对16字节块进行操作。由您自己添加填充到最后一个块并处理多个块。这就是YOGENDRASINGHHGN(块1)被加密和解密的原因,但ISARDNEGOY12345(块2)不是。

它也取决于你在每个纯文本或加密文本块的向量中做XOR之类的事情。也就是说,您负责添加“操作模式”。

您对此问题的了解是,inout指针没有长度参数:

$ grep -IR AES_encrypt | grep void
crypto/aes/aes_core.c:void AES_encrypt(const unsigned char *in, unsigned char *out,
crypto/aes/aes_x86core.c:void AES_encrypt(const unsigned char *in, unsigned char *out,
...

然后,从crypto/aes/aes_core.c

/*
 * Encrypt a single block
 * in and out can overlap
 */
void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) {
    ...
}

你应该使用AES_encrypt和朋友。它还有一些额外的缺点。这是一个纯软件实现,因此您不会喜欢硬件支持,如Intel AES-NI或带有Crypto的ARMv8a。在某些平台上,您还必须管理字节顺序。

您应该使用EVP_*个功能。请参阅OpenSSL wiki上的EVP Symmetric Encryption and Decryption。实际上,您应该使用经过身份验证的加密,因为它提供 机密性和真实性。请参阅OpenSSL wiki上的EVP Authenticated Encryption and Decryption