2013-08-12 83 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」定義的東西,您不得使用字符串函數。 (例如,是,加密過程的任意輸出。) –