Encryption mbed TLS AES-CTR的正确实施?

Encryption mbed TLS AES-CTR的正确实施?,encryption,cryptography,aes,esp32,mbed,Encryption,Cryptography,Aes,Esp32,Mbed,我正在使用这个库:带有Espressif ESP32。目标是使用AES-CTR加密一些数据,然后将密码文本解密回原始纯文本。我解密后得到的结果不正确 因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以只调用一次encrypt函数进行加密,然后再调用同一个函数一次,它就会解密。至少,大多数消息来源都是这么说的,其他实现也是如此: 我尝试使用相同的nonce、相同的流块、不同的nonce、不同的流块,在每次函数调用之前设置密钥,等等 mbedtls\u aes\u context a

我正在使用这个库:带有Espressif ESP32。目标是使用AES-CTR加密一些数据,然后将密码文本解密回原始纯文本。我解密后得到的结果不正确

因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以只调用一次encrypt函数进行加密,然后再调用同一个函数一次,它就会解密。至少,大多数消息来源都是这么说的,其他实现也是如此:

我尝试使用相同的nonce、相同的流块、不同的nonce、不同的流块,在每次函数调用之前设置密钥,等等

mbedtls\u aes\u context aes;
无符号字符键[16];
大小\u t明文\u len=64;
无符号整数nc_off=0;
无符号字符nonce_计数器[16]={0};
无符号字符流_块[16]={0};
无符号字符明文[64]={0x48,0x45,0x4c,0x4c,0x4f};
无符号字符加密文本[64];
无符号字符解密文本[64];
memcpy(key,key_128,16)//密钥_128来自不同的文件
//打印键
printf(“aes密钥:\n”);
对于(int i=0;i<16;i++){
printf(“%x”,键[i]);
}
printf(“\n”);
//打印纯文本
printf(“aes明文:\n”);
对于(int i=0;i<5;i++){
printf(“%x”,明文[i]);
}
printf(“\n”);
esp_aes_init(&aes)//上下文已初始化
esp_aes_setkey(&aes,key,128)//键与上下文关联
esp_aes_crypt_ctr(aes、明文、nc_off、nonce_计数器、流块、明文、加密文本)//加密
//打印加密文本
printf(“aes加密文本:\n”);
对于(int i=0;i<5;i++){
printf(“%x”,encryptText[i]);
}
printf(“\n”);
esp_aes_crypt_ctr(&aes、明文长度和nc_关闭、nonce_计数器、流块、加密文本、解密文本)//解密
//打印解密文本
printf(“aes解密:\n”);
对于(int i=0;i<5;i++){
printf(“%x”,解密文本[i]);
}
printf(“\n”);
第二次调用encrypt函数后,生成的decryptText应与原始纯文本相同,但此时纯文本=/=decryptText

这是我的显示器正在打印的内容:

aes key: 7d3043fb95355e6ccd850ad8debc279
aes plainText: 48454c4c4f
aes encryptText: 852b97da59
aes decryptText: 814268329f
正如你所看到的,我丢失了一些可以正确解密加密文本的东西

因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以调用加密函数

我认为你把话题混为一谈了。CTR模式确实在加密和解密的前进方向上操作密码。但是,在更高级别的mbedTLS对象中可能不存在相同的对称性


esp\u aes\u crypt\u ctr
是对
mbedtls\u aes\u crypt\u ctr
的定义。假设该函数同时更新
nonce\u计数器
stream\u块
。我相信,当您想要执行解密时,您需要重新启动这两个程序

以下是文档中提到的
stream\u block
。你没有继续加密。您需要重新启动参数

流块
-用于恢复的已保存流块。这将被函数覆盖。它必须是的可读写缓冲区 16字节


但从更大的角度来看,正如@James所评论的那样。。。您可能应该按照设计的方式使用mbedTLS,而不是尝试走捷径。

好吧,您至少必须在解密之前重新初始化密码上下文。在幕后有一个IV,它在初始化后增加每个块,需要将其重置为加密过程开始时的值。我在这里也看到了很多安全问题,看起来你们都准备好向自己的脚开枪了@什么样的安全问题?我会让其他人回答,如果他们愿意,我不会。谢谢你的回答!我试着像你提到的那样:重置nonce&stream块,但由于某种原因它不起作用。我很难理解你最后的观察:我是如何走捷径的?我遵循mbed的加密指南。再次感谢您的回复!
esp_aes_init(&aes); //context is initialized
esp_aes_setkey(&aes, key, 128); //key is associated to context

esp_aes_crypt_ctr(&aes, plainText_len, &nc_off, nonce_counter, stream_block, plainText, encryptText); //encrypt

// ...

esp_aes_crypt_ctr(&aes, plainText_len, &nc_off, nonce_counter, stream_block, encryptText, decryptText); //decrypt

// ...