C中的MCrypt,为啥加密不将明文更改为哈希/加密数据?
Posted
技术标签:
【中文标题】C中的MCrypt,为啥加密不将明文更改为哈希/加密数据?【英文标题】:MCrypt in C, why isn't the encrypting not changing the plaintext into a hash/encryption data?C中的MCrypt,为什么加密不将明文更改为哈希/加密数据? 【发布时间】:2014-11-06 03:51:32 【问题描述】:我有从https://gist.github.com/bricef/2436364 获得的这段代码,用于使用 mcrypt 加密和解密数据,但问题是,我想将明文加密为加密生成的文本,所以我可以在加密后将该文本传递给被解密。
但是当我执行下面的代码时,我得到了这个输出:
plain: myText
encrypt: myText
decrypt: myText
它并没有改变从普通到加密的任何东西,我做错了什么吗?如何获得加密生成的值,以便我可以返回函数以使其在之后解密。 我想要一个大的哈希序列,使其更安全,可以使用我用来加密它的相同私钥解密。
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;
int i = 0;
if (buffer_len % blocksize != 0)
return 1;
mcrypt_generic_init(td, key, key_len, IV);
for (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;
int i = 0;
if (buffer_len % blocksize != 0)
return 1;
mcrypt_generic_init(td, key, key_len, IV);
for (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;
int main()
MCRYPT td, td2;
char * plaintext = "myText";
char* IV = "AAAAAAAAAAAAAAAA";
char *key = "0123456789abcdef";
int keysize = 16; /* 128 bits */
char* buffer;
int buffer_len = 6;
buffer = calloc(1, buffer_len);
strncpy(buffer, plaintext, buffer_len);
printf("==C==\n");
printf("plain: %s\n", plaintext);
encrypt(buffer, buffer_len, IV, key, keysize);
printf("encrypt: %s\n", buffer);
decrypt(buffer, buffer_len, IV, key, keysize);
printf("decrypt: %s\n", buffer);
return 0;
【问题讨论】:
buffer_len
(6) 不是块大小(16 字节)的精确倍数,这是不加密/解密的一个很好的理由。
【参考方案1】:
在您的代码中,使用int buffer_len = 6;
,您永远不会在encrypt
中执行mcrypt_generic
。具体来说,encrypt
中有以下内容:
int n_blocks = buffer_len / blocksize;
...
mcrypt_generic_init (td, key, key_len, IV);
for (i = 0; i < n_blocks; i++)
mcrypt_generic (td, ((unsigned char *) buffer) + (i * blocksize),
blocksize);
由于mcrypt_enc_get_block_size (td);
返回16
,传递buffer_len = 6
导致n_blocks = 0
。简单的解决方法是使int buffer_len
成为16
的倍数。例如:16, 32, 64, ...
。使用int buffer_len = 16;
,您的代码可以正常工作:
输出:
./bin/mcry
==C==
plain: myText
encrypt: '���J�Ꮽ
decrypt: myText
【讨论】:
以上是关于C中的MCrypt,为啥加密不将明文更改为哈希/加密数据?的主要内容,如果未能解决你的问题,请参考以下文章