cnpack / cnvcl

CnPack VCL Components

Home Page:http://www.cnpack.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

Arvin-Feng opened this issue · comments

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

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

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

image

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

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

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

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

image

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

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

哦, 了解,谢谢。

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

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

哦, 看到了, 我试试。

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

非常感谢,辛苦了。