Является ли libmcrypt не надежным?

Несколько дней назад я задал вопрос о SO, без какого-либо значимого ответа. Пыль это коротко:

У меня есть программа клиентского сервера в C, которая шифрует / расшифровывает данные с помощью библиотеки mcrypt C Клиент шифрует строку, которая хочет отправить на сервер, отправить ее и после того, как сервер читает, расшифровывает ее. 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] = '\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), когда строка, расшифрованная на стороне сервера, но зашифрованная на стороне клиента, не такая же, как оригинал. Может ли кто-нибудь предложить мне, где может возникнуть проблема?

Теперь мне удалось поймать сценарий, когда я получаю описанное выше плохое поведение, которое я уже описал. Bellow – моя 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); } 

Bellow – это результат этой main функции:

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

Вопрос: Я что-то делаю неправильно, или эта библиотека проблематична?

    Наконец, я выяснил, откуда эта проблема. В main функции у меня две строки:

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

    Первая строка в порядке, пока s2 является четко определенной строкой char . Но во второй строке strlen(s2) может возвращать ошибочный результат, если приведенный зашифрованный текст содержит в нем '\0' .

    Я просто хочу сказать, что комментарий @chrylis дал мне подсказку, где искать проблему.

    В конце концов, как правило, я бы сказал: IN C , ВЫ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ФУНКЦИИ STRING НА ЭНЕРГЕТИЧЕСКОМ ТЕКСТЕ.

    Спасибо всем за помощь!