Я использую библиотеку 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. Я не понимаю, почему, передавая «тег» через сокеты, ставит под угрозу проверку целостности.
Задача ещё не решена.
Других решений пока нет …