Openssl AES_解密不工作

Openssl AES_解密不工作,openssl,aes,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&l

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

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];
}
Yogendrasinghgnisardnegoy12345

逆转

约根德拉辛格

AES_encrypt
仅在16字节块上运行。由您向最后一个块添加填充并处理多个块。这就是为什么
Yogendrasinghgn
(块1)是加密和解密的,而
IsArdengoy12345
(块2)不是

对于每一块纯文本或加密文本,您也可以在向量中执行类似XOR的操作。也就是说,您负责添加“操作模式”

问题的线索是,
in
out
指针没有长度参数:

$ 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,
...
然后,从:

您不应该使用
AES\u encrypt
和friends。它还有一些额外的缺点。这是一个仅限软件的实现,因此您将无法享受硬件支持,如Intel AES-NI或带加密的ARMv8a。在某些平台上,您还必须管理endianness

您应该使用
EVP.*
函数。请参见OpenSSL wiki上的。事实上,您可能应该使用经过身份验证的加密,因为它同时提供机密性和真实性。请参见OpenSSL wiki上的内容。

我认为这是您的副本:。
$ 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,
...
/*
 * Encrypt a single block
 * in and out can overlap
 */
void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) {
    ...
}