我正在使用这个库:https://tls.mbed.org/download用ESPRESIF ESP32。目标是使用AES-CTR加密一些数据,然后将密码文本解密回原始纯文本。我解密后得到的结果不正确。
因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以只调用一次encrypt函数进行加密,然后再调用同一个函数一次,它就会解密。至少,大多数消息来源都是这么说的,其他实现也是如此:https://github.com/kokke/tiny-AES-c
我尝试使用相同的随机数、相同的流块、不同的非随机数、不同的流块,在每个函数调用之前设置键,等等。
mbedtls_aes_context aes;
unsigned char key[16];
size_t plainText_len = 64;
unsigned int nc_off = 0;
unsigned char nonce_counter[16] = {0};
unsigned char stream_block[16] = {0};
unsigned char plainText[64] = {0x48, 0x45, 0x4c, 0x4c, 0x4f};
unsigned char encryptText[64];
unsigned char decryptText[64];
memcpy(key, key_128, 16); //key_128 comes from a different file
//Print Key
printf("aes Key: \n");
for(int i = 0; i < 16; i++){
printf("%x",key[i]);
}
printf("\n");
//Print plain-text
printf("aes plainText: \n");
for(int i = 0; i < 5; i++){
printf("%x",plainText[i]);
}
printf("\n");
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
//Print encrypt-text
printf("aes encryptText: \n");
for(int i = 0; i < 5; i++){
printf("%x",encryptText[i]);
}
printf("\n");
esp_aes_crypt_ctr(&aes, plainText_len, &nc_off, nonce_counter, stream_block, encryptText, decryptText); //decrypt
//Print decrypt-text
printf("aes decrypt: \n");
for(int i = 0; i < 5; i++){
printf("%x",decryptText[i]);
}
printf("\n");
在加密函数被第二次调用后,生成的decryptText应该与原始纯文本相同,但是,在目前的纯文本=/=decryptText。
这是我的显示器正在打印的内容:
aes key: 7d3043fb95355e6ccd850ad8debc279
aes plainText: 48454c4c4f
aes encryptText: 852b97da59
aes decryptText: 814268329f
如你所见,我错过了一些可以正确解密加密文本的东西!
由于我们使用CTR模式,我们不需要单独的“解密”函数;我们可以调用加密函数...
我认为你把话题混为一谈了。CTR模式确实在加密和解密的前进方向上操作密码。但是,在更高级别的mbedTLS对象中可能不存在相同的对称性。
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
// ...
esp\u aes\u crypt\u ctr
是对mbedtls\u aes\u crypt\u ctr
的定义mbedtls\u aes\u crypt\u ctr
文档称该函数同时更新nonce\u计数器
和流块
。我相信,当您想要执行解密时,您需要重新启动这两个程序。
以下是文档中提到的stream\u block
。你没有继续加密。您需要重新启动参数。
stream_block
-保存的用于恢复的流块。这被函数覆盖。它必须是16字节的可读可写缓冲区。
但从更大的角度来看,正如@James所评论的那样。。。您可能应该按照设计的方式使用mbedTLS,而不是尝试走捷径。
m3diaLib A fast, extensive and powerful allround media and game library for the Nintendo 3DS, written in C++. This library is deprecated. I will still merge PRs and fix critical bugs, but I'm not plan
我有一个结构如下的项目。 是我的主要应用程序,而和是导入到Project中的两个库。使用了的一些类,使用了的一些类。 在的文件中,我使用了。一切正常。但是,如果我用替换,它就不能从导入类。它给出错误。
我有个案子需要 对象,如果映射函数抛出异常,我将其映射为。 对象的映射流,如果为null,则抛出异常,否则收集到列表。 我该如何做到这一点呢? 现在我的问题是,我应该如何调整/重构上面的lambda以使on或其他。
我不知道我做错了什么,在这里试图用给定的密钥解密一串十六进制值,使用ruby的OpenSSL密码AES-128-CTR。 我正在使用gem hex_字符串将我的十六进制转换为字节 我知道我遗漏了一些小东西,因为我有类似的代码实现AES-128-CBC。我是否需要一个计数器,为密文中128字节的每一块递增IV?
问题内容: 我有一个名为User的域对象。用户的属性包括ssoId,名称,电子邮件,createdBy,createdDate和userRole。其中,ssoId必须是唯一的,因为两个用户不能具有相同的sso id。因此,我的equals方法检查sso id并返回true或false。 我认为这是一个错误的实现,尽管就业务规则而言是正确的。对于具有相同sso id但名称或电子邮件或两者具有不同值的