【问题标题】:AES_128_CBC OpenSSL DecryptionAES_128_CBC OpenSSL 解密
【发布时间】:2020-02-13 23:06:45
【问题描述】:

在使用 OpenSSL 实现 AES_128_CBC 时,我得到了一个密钥、IV 和一些明文/密文对,以查看我的代码是否正常工作。目前,当我解密时,我得到了预期的密文结果。但是,当代码尝试将密文解密回明文时,我没有得到原始明文。相反,我得到:���S@�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;
}

【问题讨论】:

    标签: c openssl aes


    【解决方案1】:

    问题是,ivaes_cbc_encrypt() 中被修改以进行下一轮加密。

    在这里,你用 already modified 向量覆盖 iv 进行解密:

    /* 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); 
    

    既然你已经复制了上面正确的向量

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

    删除下面的memset()/memcpy() 即可获得正确的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多