采用OpenSSL库的ECB模式下的AES无法产生预期结果

时间:2016-07-21 01:43:19

标签: c encryption aes

我一直在努力变得更熟悉OpenSSL库,为此我想制作一些使用不同操作模式加密文本的程序。我创建了一个程序,我想使用ECB模式加密和解密,但结果不是我所期望的。

以下是我到目前为止的代码。

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


//static const unsigned char key[]={01234567890123456789012345678900};


int main()
{


    int keylength;
    printf("Give a key length [only 128 or 192 or 256!]:\n");
    scanf("%d", &keylength);

    /* generate a key with a given length */
    unsigned char aes_key[keylength];
    memset(aes_key, 0, sizeof(aes_key));
    if (!RAND_bytes(aes_key, keylength))
     {
        exit(-1);
     }
    aes_key[keylength-1] = '\0';

    unsigned char text[] = "TestText TestText"; //Assign text to be encrypted
    unsigned char enc_out[AES_BLOCK_SIZE]; //Set to 16 bytes
    unsigned char dec_out[AES_BLOCK_SIZE];

    AES_KEY enc_key, dec_key; //establish AES enc and dec key

    AES_set_encrypt_key(aes_key, 128, &enc_key); 
    AES_encrypt(text, enc_out, &enc_key);

    AES_set_decrypt_key(aes_key, 128, &dec_key);
    AES_decrypt(enc_out, dec_out, &dec_key);

    int x;

    printf("original:\t");
    for(x=0;*(text+x)!=0x00;x++)          
    printf("%X ",*(text+x));
    printf("\nencrypted:\t");
    for(x=0;*(enc_out+x)!=0x00;x++)
    printf("%X ",*(enc_out+x));
    printf("\ndecrypted:\t");
    for(x=0;*(dec_out+x)!=0x00;x++)
    printf("%X ",*(dec_out+x));
    printf("\n");

    return 0;
} 

我知道对于ECB模式,应该将相同的明文块加密成相同的密文块,但是当我运行我的代码时,这不会发生。这是一个例子:

original: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E
encrypted: A2 FE 93 40 F5 92 95 F A2 5A D0 4A A6 53 95 58 54 65 73 74
           54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74 54 65 78 74
           2E 20 20 54 65 73 74 54 65 78 74 2E
decrypted: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74
           54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E

首先,我将输入文本转换为Hex,然后使用ECB模式对其进行加密,最后应解密所有内容。我加密的两个文本字符串是相同的,但十六进制格式的文本不显示这一点。相同的明文不共享相同的密文。明文的十六进制似乎也在拖尾加密文本,我不确定为什么会这样。任何人都可以解释为什么加密不能正常工作?我的代码中是否有任何错误未提供必要的结果?任何帮助表示赞赏。 谢谢

1 个答案:

答案 0 :(得分:2)

这里有几个问题。

首先:您正在以位和字节混合大小。 128位密钥长16字节,而不是128字节。这几乎是无害的,因为你最终会生成太大的密钥。

第二:您假设AES的输入和输出(包括密钥)以空值终止。他们不是。超过您打印的前16个字节输出的所有内容都是随机垃圾,并且密钥不会(也不应该!)以空值终止。

第三:您的测试输入("TestText TestText")太长,无法放入单个AES块。 AES_encrypt()仅在一个块上运行。