Сокет C ++: передача специальных символов

Я использую библиотеку libcrypto, чтобы использовать AES256-GCM. В этой модальности процесс шифрования возвращает «тег», который является MAC зашифрованных данных. (Другие подробности здесь https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption).
Я проверил свой класс, и он работает в том смысле, что: он шифрует данные, расшифровывает их и проверяет целостность с помощью «тега».

Если я делаю то же самое в архитектуре сервер-клиент, в которой они взаимодействуют с сокетами, проверка тегов не работает.

клиент

//NOTE: I reported only the relevant parts

unsigned char tag[BLOCK_SIZE];

aes_256_gcm_encrypt(key, iv, ptext, ctext, tag);

//some code to send the cypertext (ctext)

//Send TAG
if( write(sock , tag , sizeof(tag)) < 0) {
puts("Send tag failed");
return 1;
}
for(int i=0; i< sizeof(tag) ; i++){
cout << "tag[" << i << "] "<<tag[i] << endl;
}

Он печатает 12 очень «странных» символов. Я думаю, что это проблема, когда я пишу их на сокете.

сервер

//NOTE: I reported only the relevant parts

unsigned char tag[BLOCK_SIZE];

int read_size2 = read(sock , tag , 12);
printf("read size2 =%i\n\n", read_size2);

for(int i=0; i< sizeof(tag) ; i++){
cout << "tag[" << i << "] "<<tag[i] << endl;
}

//some code to receive the cypertext (ctext)

int ret = aes_256_gcm_decrypt(key, iv, ctext, rtext,tag);

if(ret > 0){
puts("Decryption says that authentication is OK\n");
}else{
puts("Decryption says that authentication is NOT OK\n");
}

cout << "client decrypted message: " << rtext.data() << endl << endl;

Сервер печатает одинаковые 12 символов клиента, но «ret» (который говорит, что аутентификация по зашифрованному тексту, выполненному с использованием тега, в порядке) всегда <= 0. Я не понимаю, почему, передавая «тег» через сокеты, ставит под угрозу проверку целостности.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]