AES CBC没有填充

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个帖子/ 0新
最后一篇
托马斯唐豪瑟
离线
最后一次露面:7个月1日前
加入:2019-10-20 10:45
AES CBC没有填充

你好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

所以请你解释如何获得相同的结果或其他行为。

谢谢!
托马斯

设备:
PM_DIALOG.
离线
最后一次露面:2周3天前
职员
加入: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;

这是一种错误的方法,如根据数据表,关键 - 扩展是基于初始密钥生成密钥数的过程。更多特定于分别从128,192和256比特的初始键生成11,13和15键。每轮算法都使用上述键中的每一个。对于每128位输入的加密,我们需要从此过程中使用所有生成的键。

这意味着如果将其设置为发动机执行,则软件将读取32位的15个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.

托马斯唐豪瑟
离线
最后一次露面:7个月1日前
加入:2019-10-20 10:45
你好PM_DIALOG!

你好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];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.甚至是消息的Lenght为32字符,计算的加密Lenght也是48. I'V培养了消息https://crypti.com/pipes/aes-encryption.以及IOS和Android以及所有三个平台,我会得到相同的加密结果。只有DA14683并没有使用正确的填充将加密结果扩展。据我所知,PKCS#7填充对于AES-CBC加密是强制性的。

所以我再次知道如何参数化hw_aes_hash_setup以获得与其他平台上的类似结果。

谢谢你的尊重,

托马斯

PM_DIALOG.
离线
最后一次露面:2周3天前
职员
加入:2018-02-08 11:03
托马斯,

托马斯,

以下代码段用于SDK的FreertOS_Retarget示例。

导入以下库:

#include“hw_aes_hash.h”

在for(;)循环之前的main()中调用以下代码。输入载体增加了一倍,因此我的输出双倍增加。

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.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.

托马斯唐豪瑟
离线
最后一次露面:7个月1日前
加入:2019-10-20 10:45
你好,

你好,

它已经花了一些时间,但现在我完成了它,结果是:

B86FD2D7DE80D4E7CB626CA6E7534369506653445430C9FBBB8DCCCF8DF0E34
A33003F124E39ED42B53E200502C4A251E936B50BCB71261C1AD1E06735ABE4F
03.

加密结果长为65字节,因为在输入数据中也是长度的65字节(String +终止0)。

所以结论是AES-CBC加密不支持PKCS#7填充。AES-CBC模式的加密是在任何平台(IOS,Android ...)上完成PKCS#7填充的平台。从我的角度来看,这是错误的实现。或许我只是不知道如何配置它。可能你们甚至不知道。:-)

问候,
托马斯

bobspam@free.fr.
离线
最后一次露面:5个月4天前
加入:2018-06-20 08:07
你好

你好

您是正确的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;

//添加填充
* size_out =(((size_in - 1)/ 16)+ 1)* 16;
padding_size = * size_out - size_in;
for(i = 0; i data_in [size_in + i] = padding_size;
}
size_in + = padding_size;

您必须在加密之前实现这一目标。这就是为什么我正在input_data工作的原因。

我还发现openssl意味着填充的块的最后一个字节始终使用。这意味着您不能再使用块的大小或需要添加额外块的有效载荷Mathcing,以便您始终具有传输的填充数据。这就是为什么OpenSSL / Android / iPhone加密消息长于DA。

希望能帮助到你

最好的祝福

西蒙