你好PM_DIALOG!
我使用此代码在我的应用程序中加密数据:
hw_aes_hash_setup s;Memset(&s,0,sizeof(hw_aes_hash_setup));UINT8 AESKEY [32] = {1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,};char p [] =“SiC Transit Gloria Mundi-123456。”;char e [128];Memset(E,0,Sizeof(e));s.mode = hw_aes_cbc;s.aesdirection = hw_aes_encrypt;s.aeskeysize = hw_aes_256;s.aeskeyexpand = hw_aes_do_not_perform_key_expansion; s.aesKeys = (uint32)&aesKey; s.aesIvCtrblk_0_31 = 0x01020304; s.aesIvCtrblk_32_63 = 0x05060708; s.aesIvCtrblk_64_95 = 0x090A0B0C; s.aesIvCtrblk_96_127 = 0x0D0E0FA1; s.aesWriteBackAll = true; s.moreDataToCome = false; s.sourceAddress = (uint32)&p; s.destinationAddress = (uint32)&e; s.dataSize = 32; s.enableInterrupt = false; s.callback = 0; hw_aes_hash_init(&s); hw_aes_hash_start(); while(hw_aes_hash_is_active()){}; hw_aes_hash_disable_clock();
正如我在相关的文档中读取的那样,E [128]的长度应该是在这种情况下为48字节。由于纯文本长度为32 +基于AES CBC的填充。但实际上,E [128]中的加密结果仅在处理后长32字节。
此应用程序的对应物是IOS和Android应用程序。ECRYPTIONT显示了前32字节的结果相同的结果 - 作为预期。但iOS和Android正在向结果添加填充数据,如下所示:
26 9D F3 2B 94 E9 CD DE 7A D2 6F E8 7A 7E 8D A8 1F E1 CA B7 BF A7 4F C7 17 F3 D4 2F BB E6 C3 C7 39 7A 92 FE 54 98 C7 F8 2F 13 93 15 3A 43 B0 3E
DA14683上的加密结果:
26 9D F3 2B 94 E9 CD DE 7A D2 6F E8 7A 7E 8D A8 1F E1 CA B7 BF A7 4F C7 17 F3 D4 2F BB E6 C3 C7
所以请你解释如何获得相同的结果或其他行为。
谢谢!
托马斯
设备:
托马斯,
使用SDK1.0.14和DA14683,我在我的侧面上了您附加的代码。请在下面找到我的评论:
1.输出矢量的大小(E [])将与输入向量的大小相等(P [])。为此,如果要在输出中有128个字节,则应相应地调整输入。
2. S.DataSize项目设置为32.应根据输入大小动态配置数据大小。我的建议将是如下更改它:
3.在您提供的代码段中,关键扩展由软件那
这是一种错误的方法,如根据数据表,关键 - 扩展是基于初始密钥生成密钥数的过程。更多特定于分别从128,192和256比特的初始键生成11,13和15键。每轮算法都使用上述键中的每一个。对于每128位输入的加密,我们需要从此过程中使用所有生成的键。
这意味着如果将其设置为发动机执行,则软件将读取32位的15个AES键。请检查hw_aes_hash_store_keys()的源代码。
我强烈建议您更改发动机执行的关键扩展,如下所示:
关键扩展将由专用硬件引擎执行。否则应由软件执行密钥扩展,并将生成的密钥存储到CryPTO_KEYS存储器中。
4. s.moredatatocome = false;:根据表32:DA14683数据表的Crypto_len限制,当Crypto_len Crypto_More_in = 0时,在AES CBC模式下,没有限制,如果将其更改为“True”,则它应该是16的倍数。
谢谢,PM_DIALOG.
你好PM_DIALOG!
当你想要我这样做时,我跟随你的建议并改变了片段。当我弄错时,它应该如下所示:
这最终陷入了HW_AES_HASH_INIT()的崩溃。所以我强烈怀疑你的建议在你身边。你能发布你拍摄的代码吗?
我可能解释过不够清楚的问题是什么。通常AES-CBC加密需要在最后使用0x10填充。那里的计算是:
如果是消息“SiC Transit Gloria Mundi-123456”。计算给出了48.甚至是消息的Lenght为32字符,计算的加密Lenght也是48. I'V培养了消息https://crypti.com/pipes/aes-encryption.以及IOS和Android以及所有三个平台,我会得到相同的加密结果。只有DA14683并没有使用正确的填充将加密结果扩展。据我所知,PKCS#7填充对于AES-CBC加密是强制性的。
所以我再次知道如何参数化hw_aes_hash_setup以获得与其他平台上的类似结果。
谢谢你的尊重,
托马斯
托马斯,
以下代码段用于SDK的FreertOS_Retarget示例。
导入以下库:
在for(;)循环之前的main()中调用以下代码。输入载体增加了一倍,因此我的输出双倍增加。
你可以在你身边测试它并分享结果吗?
谢谢,PM_DIALOG.
你好,
它已经花了一些时间,但现在我完成了它,结果是:
B86FD2D7DE80D4E7CB626CA6E7534369506653445430C9FBBB8DCCCF8DF0E34
A33003F124E39ED42B53E200502C4A251E936B50BCB71261C1AD1E06735ABE4F
03.
加密结果长为65字节,因为在输入数据中也是长度的65字节(String +终止0)。
所以结论是AES-CBC加密不支持PKCS#7填充。AES-CBC模式的加密是在任何平台(IOS,Android ...)上完成PKCS#7填充的平台。从我的角度来看,这是错误的实现。或许我只是不知道如何配置它。可能你们甚至不知道。:-)
问候,
托马斯
你好
您是正确的PKCS7未在DA1468X平台上实现。如果您希望将AES-CBC数据符合OpenSSL,您将必须手动实施。
查看我以前的帖子:
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...
以下是我编写的实现,以使用OPenSSL使用AES-CBC-256解码的数据
uint32_t * const size_out;
uint32_t size_in;
uint32_t padding_size;
uint8_t i;
//添加填充data_in [size_in + i] = padding_size;
* size_out =(((size_in - 1)/ 16)+ 1)* 16;
padding_size = * size_out - size_in;
for(i = 0; i
}
size_in + = padding_size;
您必须在加密之前实现这一目标。这就是为什么我正在input_data工作的原因。
我还发现openssl意味着填充的块的最后一个字节始终使用。这意味着您不能再使用块的大小或需要添加额外块的有效载荷Mathcing,以便您始终具有传输的填充数据。这就是为什么OpenSSL / Android / iPhone加密消息长于DA。
希望能帮助到你
最好的祝福
西蒙