使用具有不同密钥的AES的相同短加密结果

时间:2016-11-20 03:38:39

标签: c openssl aes

我有一个纯文本

unsigned char plaintext[] = "Hi, this is trial number one";

对于键,而不是使用类似的东西:

unsigned char key[16] = "azertyuiopqsdfg";

我决定使用大量的"dog", "azkier", "jfieifdragon", ...

到目前为止我的代码看起来像这样:

unsigned char *aes_encrypt(unsigned char *plaintext, unsigned char *key)
{
    EVP_CIPHER_CTX *ctx;
    ctx = EVP_CIPHER_CTX_new();
    unsigned char iv[16] = "0000000000000000";

    int c_len = strlen(plaintext) + AES_BLOCK_SIZE;
    int f_len = 0;
    unsigned char *ciphertext = malloc(c_len);

    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);

    EVP_EncryptUpdate(ctx, ciphertext, &c_len, plaintext, strlen(plaintext));

    EVP_EncryptFinal_ex(ctx, ciphertext+c_len, &f_len);

    EVP_CIPHER_CTX_free(ctx);

    return ciphertext;
}

当我编译并运行时,输出看起来像这样:

the key: dog
the plain: Hi, this is trial number one
ciphertext: 157a320

the key: azkier
the plain: Hi, this is trial number one
ciphertext: 157a320

.....

我的问题是:

为什么我总是得到相同的密文,即使我使用不同的密钥?

另外,为什么密文真的很短?我的明文很长。

感谢。

更新 - >我称之为aes_encrypt的方式是这样的:

unsigned char plaintext[] = "Hi, this is trial number one";
unsigned char *cipher;
cipher = aes_encrypt(plaintext, "dog");
printf("The cipher is: %x\n", cipher);
free(cipher);

unsigned char *cipher;
cipher = aes_encrypt(plaintext, "azkier");
printf("The cipher is: %x\n", cipher);
free(cipher);

1 个答案:

答案 0 :(得分:1)

在您的测试代码中:

printf("The cipher is: %x\n", cipher);

当然,这不起作用 - %xcipher地址打印为十六进制,而不是其内容。如果要转储cipher的内容,则需要自己遍历每个字节。

此外,key EVP_EncryptInit_ex参数是一个固定长度的缓冲区,其大小根据您使用的密码设置。 它不是字符串。传递短字符串可能会导致不可预测的行为,因为在字符串结束后碰巧存储的数据可能会被用作密钥的一部分。