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) {
...
}