Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MCrypt能否检查创建的哈希是否已修改?_C_Encryption_Mcrypt - Fatal编程技术网

MCrypt能否检查创建的哈希是否已修改?

MCrypt能否检查创建的哈希是否已修改?,c,encryption,mcrypt,C,Encryption,Mcrypt,我有两个函数一个用于加密和解密字符数组(变量称为:buffer),然后我将字符保存在一个文件中,以便以后可以对其进行解密,但我注意到,如果我修改加密文本中的任何字符,mcrypt不会警告任何错误,它只是在一段文本中显示不同的疯狂字符,其余的看起来很完美,我想说加密的文本字符串有一个错误 这是一种方法吗 当文本很小时,这并不明显,但因为我散列了168k个字符的文本 传递给函数的My变量:buffer\u len=32MyIV和key每个字符都是16位字符的列表 int encrypt(void*

我有两个函数一个用于加密和解密字符数组(变量称为:buffer),然后我将字符保存在一个文件中,以便以后可以对其进行解密,但我注意到,如果我修改加密文本中的任何字符,mcrypt不会警告任何错误,它只是在一段文本中显示不同的疯狂字符,其余的看起来很完美,我想说加密的文本字符串有一个错误

这是一种方法吗

当文本很小时,这并不明显,但因为我散列了168k个字符的文本

传递给函数的My变量:
buffer\u len=32
My
IV
key
每个字符都是16位字符的列表

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加密(void*buffer,int buffer\u len,char*IV,char*key,int key\u len)
{
MCRYPT td=MCRYPT模块打开(“rijndael-128”,空,“cbc”,空);
int blocksize=mcrypt\u enc\u get\u block\u size(td);
int n_blocks=缓冲区长度/块大小;
int i=0;
如果(缓冲区长度%blocksize!=0)
返回1;
mcrypt_generic_init(td,key,key_len,IV);
对于(i=0;i
mcrypt的最后一次bug修复是在2007年。使用实际维护的库,并使用HMAC功能添加身份验证标记(还应提供完整性)。别忘了在计算中包含IV。

这是一个php页面,我知道它可能也适用于C,但它是如何实现的?你能给我举个例子吗?为什么HMAC会有帮助呢?我错了,我甚至没有看你的代码。你能推荐一些用C实现的简单代码吗?试试OpenSSL的EVP API。