⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
托马斯Donhauser
离线
最后看到:7个月6个小时前
加入:2019-10-20 10:45
AES CBC无填充

你好PM_dialog !

我使用这个代码加密数据在我的应用程序:

hw_aes_hash_setup年代;memset(郑清奎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应用程序。加密显示了前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

所以你能解释一下如何得到相同的结果或者还能做什么吗?

谢谢你!
托马斯。

设备:
PM_Dialog
离线
最后看到:2周2天前
工作人员
加入:2018-02-08 11:03
你好托马斯,

你好托马斯,

我已经用SDK1.0.14和DA14683在我这边运行了你所附的代码。请看下面我的评论:

1.输出向量(e[])的大小将与输入向量(p[])的大小相等。为此,如果您希望输出中有128个字节,那么您应该相应地调整输入。

2.s.dataSize项被设置为32。根据输入的大小动态配置数据大小。我的建议是如下更改:

s.dataSize = sizeof (p);

3.在您提供的代码段中,键展开由软件

s.aesKeyExpand = HW_AES_DO_NOT_PERFORM_KEY_EXPANSION;

这是一种错误的方法,根据数据表,key - expansion是基于初始键生成键数的过程。更具体地说,从128位、192位和256位的初始密钥中分别生成11、13和15个密钥。算法的每一轮都使用上面的每一个密钥。为了加密每个128位输入,我们需要使用从这个过程中生成的所有密钥。

这意味着如果它被设置为由引擎执行,软件将读取15个32位的AES密钥。请检查hw_aes_hash_store_keys()的源代码。

我强烈建议你更改引擎执行的键展开,如下:

s.aesKeyExpand = HW_AES_PERFORM_KEY_EXPANSION;

密钥扩展将由专用硬件引擎执行。否则,应该由软件执行密钥扩展,生成的密钥应该存储在CRYPTO_KEYS内存中。

4.s.moreDataToCome = false;:根据表32:对DA14683数据表的CRYPTO_LEN的限制,当CRYPTO_LEN CRYPTO_MORE_IN = 0时,在AES CBC模式下没有限制,如果改为true,则为16的整数倍。

谢谢,PM_Dialog

托马斯Donhauser
离线
最后看到:7个月6个小时前
加入:2019-10-20 10:45
你好PM_Dialog !

你好PM_Dialog !

我听从了您的建议,按照您的要求修改了代码片段。当我做对了,它应该是这样的:

hw_aes_hash_setup年代;memset(郑清奎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];char d [128];memset (e, 0, sizeof (e));memset (d, 0, sizeof (e));s.mode = HW_AES_CBC;s.aesDirection = HW_AES_ENCRYPT; s.aesKeySize = HW_AES_256; s.aesKeyExpand = HW_AES_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 = true; //false; s.sourceAddress = (uint32)&p; s.destinationAddress = (uint32)&e; s.dataSize = sizeof(p); 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();

这最终会在hw_aes_hash_init()上崩溃。所以我很怀疑你的建议是否对你有效。你能把你测试过的代码贴出来吗?

我可能解释得不够清楚问题是什么。通常AES-CBC加密需要在末尾填充0x10。为此计算为:

Sizeof (p) + (16 - (Sizeof (p) % 16));

如果是“Sic transit gloria mundi-123456”,计算结果是48。即使消息长度为32字符,计算的加密长度也是48。我已经在上面测试过了https://cryptii.com/pipes/aes-encryption在iOS和Android上,我都会得到相同的加密结果。只有da14683没有使用适当的填充扩展加密的结果。据我所知,AES-CBC加密必须使用PKCS#7填充。

因此,我想再次了解如何参数化hw_aes_hash_setup以获得与其他平台上类似的结果。

谢谢你的亲切问候,

托马斯。

PM_Dialog
离线
最后看到:2周2天前
工作人员
加入:2018-02-08 11:03
你好托马斯,

你好托马斯,

下面的代码片段在SDK的freertos_retarget示例中使用。

导入以下库:

# include“hw_aes_hash.h”

下面的代码在main()中在for(;,)循环。输入向量增加了一倍,输出向量也增加了一倍。

hw_aes_hash_setup年代;memset(郑清奎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。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_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 = sizeof(p); 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();

你能不能也在你身边测试一下,并分享结果?

谢谢,PM_Dialog

托马斯Donhauser
离线
最后看到:7个月6个小时前
加入:2019-10-20 10:45
你好,

你好,

这花了一些时间,但现在我做到了,结果是:

b86fd2d7de80d4e7cb626ca6e75343695066e13445430c9fbbb8dcccf8df0e34
a33003f124e39ed42b53e200502c4a251e936b50bcb71261c1ad1e06735abe4f
03

加密的结果是65字节长,因为输入数据也是65字节长(字符串+结束符0)。

因此,结论是AES-CBC加密不支持PKCS#7填充。AES-CBC模式的加密可以在任何平台(iOS, Android..)使用PKCS#7填充。在我看来,这种做法是错误的。也许我只是不知道如何配置它。也许你们都不知道。:-)

问候,
托马斯。

bobspam@free.fr
离线
最后看到:5个月2天前
加入:2018-06-20 08:07
你好

你好

你是对的,PKCS7没有在DA1468x平台上实现。如果希望AES-CBC数据与openssl兼容,则必须手工实现它。

请看我之前的帖子:

https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。

下面是我编写的使用AES-CBC-256进行openssl解码的实现

Uint32_t * const size_out;

uint32_t size_in;

uint32_t padding_size;
uint8_t我;

/ /添加填充
*size_out = ((((size_in - 1) / 16) + 1) * 16;
Padding_size = *size_out - size_in;
For (i = 0;我< padding_size;我+ +){
Data_in [size_in + i] = padding_size;

size_in + = padding_size;

你必须在加密之前做到这一点。这就是我使用input_data的原因。

我还发现,openssl意味着填充总是使用块的最后一个字节。这意味着你不能再使用有效载荷匹配块的大小,或者你需要添加一个额外的块,所以你总是有填充数据传输。这就是为什么openssl/android/iphone加密的消息比DA 1长。

希望它能帮助

致以最亲切的问候

西蒙