AES加密结果只有部分数据是正确的(使用mcrypt lib)

我从https://gist.github.com/2436364下载了AES加密的示例代码。我修改了部分源代码以满足我的项目要求,如下所示:

#include  #include  #include  #include  #include  #include  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结果不正确在源代码中有错误吗?

感谢所有关心这个问题的人,我通过一次又一次的审查源代码找到了根本原因……

根本原因是函数调用:

 strncpy(buffer, plaintext, buffer_len); 

一切顺利,我用memcpy()替换strncpy()

 memcpy(buffer, plaintext, buffer_len); 

另外,我按照WhozCraig建议修改源代码如下:

 #include  #include  #include  #include  #include  #include  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