2013-04-22 173 views
1

我正在玩AES加密,我遇到了这个问题。我在网络的某个地方找到了一个代码示例,我试着玩它。 (我正在使用Gladman AES库)AES在C加密解密

#include <stdlib.h> 
#include <time.h> 
#include <stdio.h> 
#include "aes.h" 

void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key); 

void decrypt_string(const char *fileIn, const unsigned char *key); 

int main() { 

    const unsigned char key[] = "password"; 
    srand(time(NULL)); 
    aes_init(); 
    encrypt("TEST.raw", "TEST.raw.encrypted", key); 
    decrypt_string("TEST.raw.encrypted", key); 
    return 0; 
} 

void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key) { 
    int i; 
    aes_encrypt_ctx ctx[1]; 
    unsigned char iv[16]; /* initialisation vector */ 
    unsigned char inBuffer[200], outBuffer[200]; 
    FILE *inFile = fopen(fileIn, "rb"); 
    FILE *outFile = fopen(fileOut, "wb"); 

    /* pick a random initialisation vector */ 

    for(i = 0; i < 16; ++i) 
    iv[i] = rand() & 0xFF; 
    fwrite(iv, 1, 16, outFile); 

    aes_encrypt_key256(key, ctx); 
    while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0) { 
    aes_ofb_encrypt(inBuffer, outBuffer, i, iv, ctx); 
    fwrite(outBuffer, 1, i, outFile); 
    } 

    aes_ofb_encrypt(inBuffer, outBuffer, i, iv, ctx); 
    fwrite(outBuffer, 1, i, outFile); 
    fclose(inFile); 
    fclose(outFile); 
} 

void decrypt_string(const char *fileIn, const unsigned char *key) { 
    int i,j; 
    aes_encrypt_ctx ctx[1]; 
    unsigned char iv[16]; /* initialisation vector */ 
    unsigned char inBuffer[200], outBuffer[200]; 
    FILE *inFile = fopen(fileIn, "rb"); 
    //FILE *outFile = fopen(fileOut, "wb"); 
    /* read initialization vector from file */ 
    if(fread(iv, 1, 16, inFile) < 16) 
    return; /* error: file doesn't even contain an initialisation vector */ 

    aes_encrypt_key256(key, ctx); 
    while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0) { 
    aes_ofb_decrypt(inBuffer, outBuffer, i, iv, ctx); 
    printf("%s", outBuffer); 
    } 

    fclose(inFile); 
} 

现在一切工作正常,文件得到正确解密。

但是,当我拿到加密文件并尝试使用decrypt_string()函数再次解密时,它不能正确解密。它只在程序运行时才起作用。现在我一直在搜索aes.h中的注释,它可能与aes_mode_reset()有关。但我只是在学习,所以我不太了解它。所以我会很感激我能得到的任何帮助。

回答

3

你的key包括垃圾。 AES256密钥不是字符串;它恰好是32个字节的二进制数据。您传递八个字节(“密码”)加上接下来发生在堆栈上的24个字节。

您不能将人为密码传递给aes_encrypt_key256()。您需要先使用PBKDF2或其他密钥派生函数(例如bcrypt或scrypt)将其转换为密钥。 BSD在C.中有许多PBKDF2实现中的一种。