Несколько дней назад я задал вопрос на SO без какого-либо значимого ответа. Ниже это вкратце:
У меня есть клиент-серверная программа на 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
Вопрос. Я делаю что-то не так или проблема в этой библиотеке?
STRING_SIZE
? - person ouah   schedule 12.08.2013KEY_SIZE
? Ваша программа неполная, предоставьте всю недостающую информацию. - person ouah   schedule 12.08.2013KEY_SIZE
16. - person artaxerxe   schedule 12.08.2013civ
вашим вектором инициализации? - person chrylis -cautiouslyoptimistic-   schedule 12.08.2013strncpy
для необработанных двоичных данных, таких как ключи шифрования, IV и зашифрованные тексты, является ошибкой; они могут совершенно законно содержать'\0'
. Вместо этого используйтеmemcpy
. Однако я не думаю, что это вызывает проблему здесь. - person chrylis -cautiouslyoptimistic-   schedule 12.08.2013