2013-01-03 61 views
1

這是我的代碼(錯誤檢查被故意省略了對代碼的可讀性):AES128/CBC測試不工作

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <gcrypt.h> 

#define GCRYPT_VERSION "1.5.0" 
#define GCRY_CIPHER GCRY_CIPHER_AES128 

int main(void){ 
    if(!gcry_check_version(GCRYPT_VERSION)){ 
     fputs("libgcrypt version mismatch\n", stderr); 
     exit(2); 
    } 
    gcry_control(GCRYCTL_SUSPEND_SECMEM_WARN); 
    gcry_control(GCRYCTL_INIT_SECMEM, 16384, 0); 
    gcry_control(GCRYCTL_RESUME_SECMEM_WARN); 
    gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); 

    int algo = -1; 
    size_t i; 
    const char *name = "aes128"; 
    char plain_text[16] = {0x80}; 
    char key[16] = {0}; 
    char iniVector[16] = {0}; 
    size_t txtLenght = strlen(plain_text); 
    char *encBuffer = malloc(txtLenght); 
    gcry_cipher_hd_t hd; 
    algo = gcry_cipher_map_name(name); 
    size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER); 
    size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER); 

    gcry_cipher_open(&hd, algo, GCRY_CIPHER_MODE_CBC, 0); 
    gcry_cipher_setkey(hd, key, keyLength); 
    gcry_cipher_setiv(hd, iniVector, blkLength); 
    gcry_cipher_encrypt(hd, encBuffer, txtLenght, plain_text, txtLenght); 

    printf("encBuffer = "); 
    for(i = 0; i < txtLenght; i++){ 
     printf("%02x", (unsigned char) encBuffer[i]); 
    } 
    printf("\n"); 

    gcry_cipher_close(hd); 
    free(encBuffer); 
    return 0; 
} 

預期結果:
KEY = 00000000000000000000000000000000
IV = 00000000000000000000000000000000
PLAINTEXT = 80000000000000000000000000000000
CIPHERTEXT = 3ad78e726c1ec02b7ebfe92b23d9ec34

我的結果:
KEY = 00000000000000000000000000000000
IV = 00000000000000000000000000000000
PLAINTEXT = 80000000000000000000000000000000
密文= 42

爲什麼我得到這個輸出?我究竟做錯了什麼?

+0

是否確定要包括結尾的空字符:'爲size_t txtLenght = strlen的(plain_text) +1;''? – ouah

+0

哦,親愛的!你是對的!我更新了我的代碼! – polslinux

+1

現在你確定你的純文本,鍵和iv必須是ASCII格式而不是十六進制格式嗎? – ouah

回答

1

您正在使用ASCII值,但AES測試向量是以十六進制值的形式給出的。

嘗試用十六進制值,而不是(數組的剩餘值由0用C初始化):

char plain_text[16] = {0x80}; 
char key[16] = {0}; 
char iniVector[16] = {0}; 

size_t txtLenght = sizeof plain_text; 
+0

現在我的輸出是:42 O.o – polslinux

+0

我已經用您的答案更新了我的問題! – polslinux

+0

你必須改變'txtLength'也 – ouah