AES_128_CBC OpenSSL解密

AES_128_CBC OpenSSL解密,c,openssl,aes,C,Openssl,Aes,在用OpenSSL实现AES_128_CBC时,我得到了一个密钥、IV和一些明文/密文对,以查看我的代码是否正常工作。目前,当我解密时,我得到了预期的密文结果。但是,当代码试图将密文解密回明文时,我无法获得原始明文。相反,我得到的是:���@�3.��6.�Y�Y�. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h>

在用OpenSSL实现AES_128_CBC时,我得到了一个密钥、IV和一些明文/密文对,以查看我的代码是否正常工作。目前,当我解密时,我得到了预期的密文结果。但是,当代码试图将密文解密回明文时,我无法获得原始明文。相反,我得到的是:���@�3.��6.�Y�Y�.

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <openssl/aes.h>

 #define BUFSIZE 1024

 /* AES key for Encryption and Decryption */
 const static unsigned char aes_key[]= . {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF};
 unsigned char iv[] = {0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA};
 unsigned char tmpIv[sizeof(iv)]; 
 /* Print Encrypted and Decrypted data packets */
 void print_data(const char *title, const void* data, int len);


int main( ) {
    /* Input data to encrypt */
    unsigned char aes_input[BUFSIZE] = {0};
    strcpy(aes_input, "Testing");

    fprintf(stderr, "%s\n", aes_input);

    print_data("Init IV: ", iv, sizeof(iv));


    /* Init vector */

    memcpy(tmpIv, iv, sizeof(iv));

    /* Buffers for Encryption and Decryption */
    unsigned char enc_out[sizeof(aes_input)];
    unsigned char dec_out[sizeof(aes_input)];
    unsigned char *e = enc_out;

    /* AES-128 bit CBC Encryption */
    AES_KEY enc_key, dec_key;
    AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key);
    AES_cbc_encrypt(aes_input, enc_out, strlen(aes_input), &enc_key, iv, AES_ENCRYPT);
    fprintf(stderr, "Encrypted:");
    while (*e) printf(" [%02x]", *e++);
    printf("\n");

    /* AES-128 bit CBC Decryption */
    memset(tmpIv, 0x00, sizeof(iv));
    memcpy(tmpIv, iv, sizeof(iv)); 
    AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); 
    AES_cbc_encrypt(enc_out, dec_out, strlen(aes_input), &dec_key, tmpIv, AES_DECRYPT);
    fprintf(stderr, "The Plaintext After Decryption is: %s\n", dec_out);



    return 0;
}
#包括
#包括
#包括
#包括
#定义bufsize1024
/*用于加密和解密的AES密钥*/
常量静态无符号字符aes_键[]=。{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF};
无符号字符iv[]={0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA};
无符号字符tmpIv[sizeof(iv)];
/*打印加密和解密的数据包*/
无效打印数据(常量字符*标题,常量无效*数据,整数长度);
int main(){
/*输入要加密的数据*/
无符号字符aes_输入[BUFSIZE]={0};
strcpy(aes_输入,“测试”);
fprintf(标准,“%s\n”,aes\u输入);
打印数据(“初始IV:,IV,尺寸(IV));
/*初始向量*/
memcpy(tmpIv、iv、sizeof(iv));
/*用于加密和解密的缓冲区*/
无符号字符输出[sizeof(aes输入)];
无符号字符dec_out[sizeof(aes_输入)];
无符号字符*e=enc_out;
/*AES-128位CBC加密*/
AES_键enc_键,dec_键;
AES_设置_加密_密钥(AES_密钥、sizeof(AES_密钥)*8和enc_密钥);
AES_cbc_加密(AES_输入、enc_输出、strlen(AES_输入)和enc_密钥、iv、AES_加密);
fprintf(标准格式,加密:);
而(*e)printf(“[%02x]”,*e++);
printf(“\n”);
/*AES-128位CBC解密*/
memset(tmpIv,0x00,sizeof(iv));
memcpy(tmpIv、iv、sizeof(iv));
AES_设置_解密_密钥(AES_密钥、sizeof(AES_密钥)*8和dec_密钥);
AES_cbc_加密(enc_out、dec_out、strlen(AES_输入)和dec_密钥、tmpIv、AES_解密);
fprintf(stderr,“解密后的明文为:%s\n”,dec_out);
返回0;
}

问题是,在下一轮加密中,
aes\u cbc\u encrypt()
中修改了
iv

在这里,使用已修改的向量覆盖iv进行解密:

因为您已经复制了上面的正确向量

/* Init vector */
memcpy(tmpIv, iv, sizeof(iv));
删除下面的
memset()
/
memcpy()
即可获得正确的结果

/* Init vector */
memcpy(tmpIv, iv, sizeof(iv));