2013-08-12 58 views
1

前几天我对SO提出了一个问题,没有任何有意义的答案。波纹管是简短的:libmcrypt不可靠吗?

我有一个C客户端服务器程序,用mcrypt C的库加密/解密数据。客户端将想要发送给服务器的字符串进行加密,发送,并在服务器读取后对其解密。贝娄是我的加密和解密功能:

加密功能:

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] = '\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率)当一个字符串解密在服务器端,但在客户端加密是不一样的原来的。任何人都可以提出我的问题来自哪里?

现在,当我收到我已经描述的上述不良行为时,我设法抓住了一个场景。贝娄是我main功能:

int main(void) { 

    char *newKey = "P1adEfRuPX0AP2UDmSWHhgS6DaIrE4eb5EEJudC"; 
    char *iv = "asdfkSSDFAEGasld3G9dkDF0"; 
    char *s1 = "XZH9ZYKQC9*NYSR6UDUII"; 
    char *s2 = malloc(STRING_SIZE * sizeof(char)); 

    strcpy(s2, s1); 
    printf("%s - %s\n", s1, s2); 

    encrypt(s2, newKey, iv, strlen(s2)); 
    decrypt(s2, newKey, iv, strlen(s2)); 

    if (strncmp(s1, s2, STRING_SIZE) != 0) 
     printf("wrong encrypt-decrypt: %s %s\n", s1, s2); 

    exit(0); 

} 

贝娄是从main函数的输出:

XZH9ZYKQC9*NYSR6UDUII - XZH9ZYKQC9*NYSR6UDUII 
wrong encrypt-decrypt: XZH9ZYKQC9*NYSR6UDUII XZH9ZYKQC 

问: 我做得不对,或者是该库有问题?

+0

什么是STRING_SIZE? – ouah

+0

@ouah STRING_SIZE是40. – artaxerxe

+0

和'KEY_SIZE'?您的程序不完整,请提供所有缺少的信息。 – ouah

回答

1

最后,我想出问题来自哪里。 在main功能,我有两条线:

encrypt(s2, newKey, iv, strlen(s2)); 
decrypt(s2, newKey, iv, strlen(s2)); 

第一行是确定的,只要S2是良好限定的char字符串。但在第二行中,如果得到的加密文本包含,则strlen(s2)可能会返回错误的结果。

我只想说,@chrylis的评论给了我一个暗示在哪里寻找问题。作为一个经验法则,我会说:IN C,您不得在加密文本上使用STRING的函数。

感谢大家的帮助!

+2

更准确地说,对于不符合C的“string”定义的东西,您不得使用字符串函数。 (例如,是,加密过程的任意输出。) –