cnpack / cnvcl

CnPack VCL Components
http://www.cnpack.org
335 stars 102 forks source link

大佬, 为啥用cnpack的sm4算出来的和C#、java的不一样呢? #14

Closed Arvin-Feng closed 3 years ago

shanzhashu commented 3 years ago

分组加密考虑的因素有很多:

1、每块的加密算法(DES/AES/SM4等) 2、数据分块的每块大小(128/192/256等) 3、块与块之间的运算模式(ECB/CBC等) 4、数据不满足整数块时如何填充(PKCS1/PKCS7等) 5、密文是否要转变成可读的(Hex/Base64等)

两个加密机制,但凡有一处和所需的不一样,加密出来的结果就对不上号。

Arvin-Feng commented 3 years ago

image

服务是Java的, 用C#的sm4库加密可以验证通过, 但Delphi不行, 一样的key和字符串,ecb , 算出来的码和C#的不一样,烦啊, 看来只能用C#封装个库给Delphi调用了。

shanzhashu commented 3 years ago

要先确定一下字符串是什么编码。 猜测你的Java和C#都是将字符串转成了UTF8后加密,但Delphi没有指定UTF8,导致加密的原始内容不同。

Arvin-Feng commented 3 years ago

原文: abc key: 5ed70848fa4f5436 模式:ECB

这是C#和在线工具的计算结果, 也一样的。 image

image

以下是cnpack自带Demo计算的结果: image

shanzhashu commented 3 years ago

4、数据不满足整数块时如何填充(PKCS1/PKCS7等) ——从图中看出是填充方式的差异。你的工具用的是PKCS7的填充,我们的工具用的是尾部加#0填充。

Arvin-Feng commented 3 years ago

哦, 了解,谢谢。

shanzhashu commented 3 years ago

CnPack的SM4库改用PKCS7Padding的方式加密后,和楼主提供的结果一致。

Arvin-Feng commented 3 years ago

请问, 怎么改啊,demo里没看到参数啊。

Arvin-Feng commented 3 years ago

哦, 看到了, 我试试。

shanzhashu commented 3 years ago

嗯,我更新了Demo,加上了Padding这个选项供测试。

Arvin-Feng commented 3 years ago

非常感谢,辛苦了。