Несколько дней назад я задал вопрос о 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 НА ЭНЕРГЕТИЧЕСКОМ ТЕКСТЕ.
Спасибо всем за помощь!