C ++ socket:传输特殊字符

时间:2017-07-24 15:24:29

标签: c++ sockets openssl unsigned-char aes-gcm

我使用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;在套接字上,会破坏完整性验证。

0 个答案:

没有答案