我使用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个非常&#34;奇怪&#34;字符。我认为当我在套接字上写它时这是一个问题。
服务器
//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个字符但是&#34; ret&#34; (其说,如果通过使用标签进行过密文的认证OK)是总是小于= 0我不&#39;吨理解为什么通过使&#34;标记&#34;在套接字上,会破坏完整性验证。