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,为啥加密不将明文更改为哈希/加密数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]

mcrypt 如何加/解密 ?

RSA已知明文和公钥能得到私钥加密的密文吗

网站为啥需要安装SSL安全证书?

为啥不将哈希函数迭代 10,000,000 次? [复制]

使用 Perl CBC 加密并使用 PHP mcrypt 解密