c++ - 加密和解密未显示正确的值

标签 c++ linux openssl aes

我的代码如下

unsigned char aes_key[]= "asytfuhcilejnco";
unsigned char input_data[]= "Sandeep";
unsigned char enc_buffer[sizeof(input_data)+1];
unsigned char dec_buffer[sizeof(input_data)+1];

AES_KEY enc_key,dec_key;
unsigned char iv[AES_BLOCK_SIZE];

int main()
{

    memset(iv,0x00,AES_BLOCK_SIZE);
    AES_set_encrypt_key(aes_key,sizeof(aes_key)*8,&enc_key);
    AES_cbc_encrypt(input_data,enc_buffer,sizeof(input_data),&enc_key,iv,AES_ENCRYPT);
    enc_buffer[sizeof(input_data)+1]='\0';//b

    memset(iv,0x00,AES_BLOCK_SIZE);
    AES_set_decrypt_key(aes_key,sizeof(aes_key)*8,&dec_key);
    AES_cbc_encrypt(enc_buffer,dec_buffer,sizeof(input_data),&dec_key,iv,AES_DECRYPT);
    dec_buffer[sizeof(input_data)+1]='\0';//a

    cout<<"input_data="<<input_data<<endl;
    cout<<"enc_buffer="<<enc_buffer<<endl;
    cout<<"dec_buffer="<<dec_buffer<<endl;
}

我使用 input_data 作为要加密的数据。 2 个缓冲区 enc_buffer 和 dec_buffer 用于保存加密和解密的数据。但是当我运行以下程序时,缓冲区不会显示与原始输入数据匹配的解密数据。如果我注释行“a”和“b”,则加密和解密的数据值匹配。但在这种情况下,原始数据以加密数据显示。

程序的输出

input_data=Sandeep
enc_buffer=X��8��Ȏ
dec_buffer=2���yT�

带有 a 和 b 注释的程序输出

input_data=Sandeep
enc_buffer=X��8��Ȏ��Yٔ�iSandeep
dec_buffer=Sandeep

最佳答案

AES是一种 block 加密算法。所以enc_buffer必须如下声明

unsigned char enc_buffer[AES_BLOCK_SIZE];

尺寸必须乘以AES_BLOCK_SIZE并且大于或等于输入数据的大小。

您不必为零保留位置并将零插入 enc_buffer 的末尾。它将包含二进制数据,而不是字符串图表,因此不能像 cout << enc_buffer 那样打印。 。如果你想打印它,你必须考虑如何转储二进制数据,可能是十六进制或 Base64 格式。

关于c++ - 加密和解密未显示正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493945/

相关文章:

c++ - C++11/C++14 中的文字类型类

linux - 如果匹配,则在文件中搜索字符串用某个字符串替换同一行中的另一个字符串

java - LifecycleException 无效的服务器 SSL 协议(protocol)

objective-c - 使用未解析的标识符 'PKCS7_type_is_signed'

php - CentOS 7.x 上 Laravel : PHP 7. x 的 Docker 容器

Java SHA1WithRSA 使用 openssl 命令行

c++ - Cuda 零拷贝性能

c++ - 将文件读取到 vector 的 vector ,超出范围错误

android - Android 上的 C++ 代码 - execl() 函数调用失败

python - 一个简单的Python部署问题-痛苦的世界