C语言中的libmcrypt问题

时间:2013-08-08 10:35:19

标签: c mcrypt

我在C中有一个客户端服务器程序,用mcrypt库加密/解密数据。客户端加密要发送到服务器的字符串,发送它,并在服务器读取后解密它。 Bellow是我的加密和解密功能:

加密功能:

void encrypt(char *es, char *key, char *civ, size_t  length) {

    MCRYPT td;
    int n;

    td = mcrypt_module_open(MCRYPT_TWOFISH, NULL, MCRYPT_CFB, NULL );
    if (td == MCRYPT_FAILED) {
        log_err(log_opts, strerror(errno));
        exit(1);
    }
    n = mcrypt_enc_get_iv_size(td);

    char iv[n + 1];
    strncpy(iv, civ, n);
    iv[n] = '\0';

    if ((mcrypt_generic_init(td, key, KEY_SIZE, iv)) < 0) {
        log_err(log_opts, "while trying to do mcrypt_generic_init.");
        exit(1);
    }
    mcrypt_generic(td, es, length);

    if (mcrypt_module_close(td) < 0) {
        log_err(log_opts, "while trying to close module.");
        exit(1);
    }

}

解密功能

void decrypt(char *ds, char *key, char *civ, size_t length) {
    MCRYPT td;
    int n;

    td = mcrypt_module_open(MCRYPT_TWOFISH, NULL, MCRYPT_CFB, NULL );
    n = mcrypt_enc_get_iv_size(td);

    char iv[n + 1];
    strncpy(iv, civ, n);
    iv[n + 1] = '\0';

    if ((mcrypt_generic_init(td, key, KEY_SIZE, iv)) < 0) {
        log_err(log_opts, "trying to do mcrypt_generic_init.");
        exit(1);
    }

    mdecrypt_generic(td, ds, length);
    if (mcrypt_module_close(td) < 0) {
        log_err(log_opts, "while trying to close module.");
        exit(1);
    }

}

我的问题:

当在服务器端解密但在客户端加密的字符串与原始字符串不同时,存在(1到10速率)的情况。任何人都可以建议我的问题出在哪里?


修改

对这个问题的回答,你可以找到here,这个问题也在进一步详述,指出包含错误的代码。

2 个答案:

答案 0 :(得分:1)

decrypt函数中:

char iv[n + 1];
strncpy(iv, civ, n);
iv[n + 1] = '\0';

iv[n + 1] = '\0';声明中有一个逐个溢出。

答案 1 :(得分:0)

问题是我在原始字节数组上使用了字符串函数。查看this链接了解更多详情。