2012-11-12 48 views
3

我从https://gist.github.com/2436364 下载的AES加密的样本代码,我修改了部分源代码,以满足下面我的项目要求:AES加密结果只有部分数据是正确的(使用mcrypt的LIB)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mcrypt.h> 
#include <math.h> 
#include <stdint.h> 

int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    if(buffer_len % blocksize != 0) 
    return 1; 

    mcrypt_generic_init(td, key, key_len, IV); 
    mcrypt_generic(td, buffer, buffer_len); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 

int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    if(buffer_len % blocksize != 0) 
    return 1; 

    mcrypt_generic_init(td, key, key_len, IV); 
    mdecrypt_generic(td, buffer, buffer_len); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 

void display(char* ciphertext, int len){ 
    int v; 
    for (v=0; v<len; v++){ 
    if(v % 16 == 0) putchar('\n'); 
    printf("%02X ", (unsigned char)ciphertext[v]); 
    } 
    printf("\n"); 
} 

int main() 
{ 
    unsigned char plaintext[256]; 
    unsigned char IV[16] = {0xFA,0x8D,0x46,0x54,0x83,0xC6,0xED,0xD8, 
    0x37,0x5A,0x9D,0xC1,0x3E,0x69,0x1B,0x04}; 
    unsigned char key[16] = {0x53, 0x75, 0x7a, 0x79, 0x26, 0x52, 0x69, 0x63, 
    0x68, 0x42, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x20}; 
    int keysize = 16; /* 128 bits */ 
    char* buffer; 
    int buffer_len = 256; 
    FILE *fp; 

    fp = fopen("readbuf.bin", "r"); 
    fread(plaintext, 1, 256, fp); 
    fread(plaintext, 1, 256, fp); 
    fclose(fp); 

    buffer = calloc(1, buffer_len); 
    strncpy(buffer, plaintext, buffer_len); 

    //printf("plain: %s\n", plaintext); 
    encrypt(buffer, buffer_len, IV, key, keysize); 
    printf("cipher: "); display(buffer , buffer_len); 
    //decrypt(buffer, buffer_len, IV, key, keysize); 
    //printf("decrypt: %s\n", buffer); 

    return 0; 
} 

我需要加密readbuf.bin 的字节255〜511我得到的结果字节0〜0x6F是正确的,但是由于字节0x70的结果不正确 源代码中是否有错误?

回答

1

感谢大家谁照顾这个问题,我发现通过审查源代码的根本原因连连......

的根本原因是函数调用:

strncpy(buffer, plaintext, buffer_len); 

一切顺利,而予替换的memcpy函数strncpy()()

memcpy(buffer, plaintext, buffer_len); 

另外,我遵循WhozCraig建议修改源代码如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mcrypt.h> 
#include <math.h> 
#include <stdint.h> 

int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len) 
{ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    int n_blocks = buffer_len/blocksize; 
    if(buffer_len % blocksize != 0) 
    return 1; 

    mcrypt_generic_init(td, key, key_len, IV); 
    for (int i = 0; i < n_blocks; i++) 
    mcrypt_generic(td, ((unsigned char*)buffer) + (i * blocksize), blocksize); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 

int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    int n_blocks = buffer_len/blocksize; 
    if(buffer_len % blocksize != 0) 
    return 1; 

    mcrypt_generic_init(td, key, key_len, IV); 
    for (int i = 0; i < n_blocks; i++) 
    mdecrypt_generic(td, ((unsigned char *)buffer) + (i * blocksize), blocksize); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 

void display(char* ciphertext, int len){ 
    int v; 
    for (v=0; v<len; v++){ 
    if(v % 16 == 0) putchar('\n'); 
    printf("%02X ", (unsigned char)ciphertext[v]); 
    } 
    printf("\n"); 
} 

int main() 
{ 
    unsigned char plaintext[256]; 
    unsigned char IV[16] = {0xFA,0x8D,0x46,0x54,0x83,0xC6,0xED,0xD8, 
    0x37,0x5A,0x9D,0xC1,0x3E,0x69,0x1B,0x04}; 
    unsigned char key[16] = {0x53, 0x75, 0x7a, 0x79, 0x26, 0x52, 0x69, 0x63, 
    0x68, 0x42, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x20}; 
    int keysize = 16; /* 128 bits */ 
    char* buffer; 
    int buffer_len = 256; 
    FILE *fp; 

    fp = fopen("readbuf.bin", "r"); 
    fread(plaintext, 1, 256, fp); 
    fread(plaintext, 1, 256, fp); 
    fclose(fp); 

    buffer = calloc(1, buffer_len); 
    //strncpy(buffer, plaintext, buffer_len); 
    memcpy(buffer, plaintext, buffer_len); 

    printf("plain: %s\n", plaintext); 
    encrypt(buffer, buffer_len, IV, key, keysize); 
    printf("cipher: "); display(buffer , buffer_len); 
    decrypt(buffer, buffer_len, IV, key, keysize); 
    printf("decrypt: %s\n", buffer); 

    return 0; 
}