导航:
论坛 -> 发布代码
斑竹:liumazi,ruralboy
作者:
2023/3/23 13:37:52
标题:
一个功能完备的国密SM4类(TSM4)
浏览:3433
加入我的收藏
楼主:
本软件使用Delphi 10.3.3编写和测试, 源码中用到了System.NetEncoding和Generics.Collections两个单元, 因此本程序仅支持Delphi XE及更新的版本. 支持6种加密模式: ECB, CBC, CFB, OFB, PCBC, CTR; 默认为ECB; 支持7种填充模式(ZERO, PKCS5, PKCS7, ISO10126, ANSIX923, OneAndZero); 默认为PKCS7; SM4要求密码长度的长度为16个字节(128bit), 如果长度不足, 程序就填充0x00来补足 SM4要求初始向量的长度为16个字节(128bit), 如果长度不足, 程序就填充0x00来补足 SrcBuffer, KeyBuffer, IVBuffer, DestBuffer: TBuffer 说明: SrcBuffer存放待加密/解密的数据, KeyBuffer存放密码数据, IVBuffer存放初始向量数据, DestBuffer存放已加密/解密的数据 TBuffer本身带有各种数据转换函数, 数据转换非常方便,不需要另外再写代码,例如: function ToString(Encoding: TEncoding): String; function ToHexString: String; function ToDelimitedHexString(Prefix: String; Delimitor: String): String; function ToBase64String: String; procedure ToBytes(var OutBytes: TBytes; ByteLen: Integer); procedure FromString(const Str: String); procedure FromString(const Str: String; Encoding: TEncoding); procedure FromHexString(const Str: String); procedure FromDelimitedHexString(HexStr: String; Prefix: String; Delimitor: String'); procedure FromBase64String(const Str: String); procedure FromBytes(const InBytes: TBytes; ByteLen: Integer); 最简单的TSM4使用示范代码: —————————— 版权声明:本文为CSDN博主「BlueStorm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/BlueStorm/article/details/129709353
----------------------------------------------
-
作者:
2023/3/23 13:39:07
1楼:
截图
此帖子包含附件: 大小: 19.9K
----------------------------------------------
-
作者:
2023/3/23 13:40:39
2楼:
最简单的使用示范: procedure TMainForm.SimpleDemo; //最简单使用示范代码 var S1, S2: String; begin with TSM4.Create(cmCBC, pmPKCS5) do begin SrcBuffer.FromString('先学着让自己值钱'); KeyBuffer.FromBase64String('MTIzNDU2Nzg5MDEyMzQ1Ng=='); //1234567890123456 //或KeyBuffer.FromString('1234567890123456'); IVBuffer.FromHexString('6162636465666768696A6B6C6D6E6F70'); //abcdefghijklmnop Encrypt; S1 := DestBuffer.ToHexString; //6C19FEC30147DBDE9539DC1DF0F3ACF09B6E6210F0F220D3D923F200DC5A44C4 SrcBuffer.FromHexString(S1); Decrypt; S2 := DestBuffer.ToString; //'先学着让自己值钱' Free; end; end;
----------------------------------------------
-
作者:
2023/3/23 15:45:23
3楼:
感谢分享!
----------------------------------------------
-
作者:
2023/3/23 17:25:06
4楼:
感谢分享,项目刚好要用。
----------------------------------------------
-
作者:
yxsoft (yxsoft)
★☆☆☆☆
-
盒子活跃会员
2023/3/23 23:05:06
5楼:
不错,先收藏
----------------------------------------------
Great!
作者:
szlbz (秋风)
★☆☆☆☆
-
盒子活跃会员
2023/3/24 7:15:37
6楼:
不错,谢谢分享。可以考虑移植到lazarus
----------------------------------------------
-
作者:
2023/3/24 8:53:17
7楼:
好东西
----------------------------------------------
-
作者:
xjia (xjia)
★☆☆☆☆
-
盒子活跃会员
2023/3/24 11:11:48
8楼:
感谢分享~~
----------------------------------------------
-
作者:
2023/3/24 21:42:33
9楼:
感谢分享,先收藏
----------------------------------------------
-
作者:
2023/3/24 21:47:45
10楼:
SM2也可以搞搞, 根据SM2算法(Signature的algorithm选择SM3withSM2),签名报文。通过对报文数据筛选、排序和拼接,组成待签名报文数据。 这个能做个例子吗
----------------------------------------------
长兴波波
作者:
2023/3/25 7:05:09
11楼:
CnPack组件包支持纯Pascal的国密实现,https://github.com/cnpack/cnvcl
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
szlbz (秋风)
★☆☆☆☆
-
盒子活跃会员
2023/3/25 7:08:54
11楼:
根据网上的SM4代码移植到lazarus使用,lazarus版可以跨平台,截图是在龙芯3A5000运行。 https://www.cnblogs.com/qiufeng2014/p/17254060.html
此帖子包含附件: 大小: 1.18M
----------------------------------------------
-
作者:
2023/3/25 12:07:01
12楼:
弱弱的问一句,有什么用?
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
作者:
2023/3/25 14:53:05
13楼:
用处大了,医保对接全部用的国密 SM2 SM4,医疗系统delphi软件对这个是刚需
----------------------------------------------
长兴波波
作者:
2023/3/25 14:53:47
14楼:
2000元一个sm2都是便宜卖了
----------------------------------------------
长兴波波
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2023/3/25 15:49:25
15楼:
用OpenSSL 的SM2加解密,有个奇怪的现象: 估计不符合国标,我没看到有要求C1C2C3或C1C3C2的排序,只是取了曲线名称为"SM2",也就是"prime256v1",用ECDSA方法来生成钥匙对。 签名和验签正常。 加密解密时,公钥加密、私钥解密,正常; 反过来,私钥加密,公钥解密,就不行了。 虽然大部分场景是(公钥加密、私钥解密),但是(私钥加密,公钥解密)也是有用到的地方。 同样用OPENSSL实现的RSA(OAEP)就没这问题。 生成钥匙对的代码: function CreateKeyPair_SM2(out APrivateKey, APublicKey: TBytes): boolean; var LecKey: PEC_KEY; LecGroup: PEC_GROUP; LPrivateKeyLen, LPublicKeyLen: Integer; LBIOPriKey, LBIOPubKey: PBIO; LBIOPriKeyLen, LBIOPubKeyLen: Integer; begin Result := False; LBIOPriKeyLen := 0; LBIOPubKeyLen := 0; LPrivateKeyLen := 0; LPublicKeyLen := 0; LecKey := EC_KEY_new(); try if LecKey = nil then Exit; //SM2的 NID = 1172 LecGroup := EC_GROUP_new_by_curve_name(1172); if LecGroup = nil then Exit; try if EC_KEY_set_group(LecKey, LecGroup) <> 1 then Exit; if EC_KEY_generate_key(LecKey) <> 1 then Exit; LBIOPriKey := BIO_new(BIO_s_mem); //BIO_s_file LBIOPubKey := BIO_new(BIO_s_mem); try if PEM_write_bio_ECPrivateKey(LBIOPriKey, LecKey, nil, nil, 0, nil, nil) <> 1 then Exit; if PEM_write_bio_EC_PUBKEY(LBIOPubKey, LecKey) <> 1 then Exit; LBIOPriKeyLen := BIO_ctrl_pending(LBIOPriKey); LBIOPubKeyLen := BIO_ctrl_pending(LBIOPubKey); if (LBIOPriKeyLen = 0) or (LBIOPubKeyLen = 0) then Exit; SetLength(APrivateKey, LBIOPriKeyLen); SetLength(APublicKey, LBIOPubKeyLen); LPrivateKeyLen := BIO_read(LBIOPriKey, @APrivateKey[0], LBIOPriKeyLen); LPublicKeyLen := BIO_read(LBIOPubKey, @APublicKey[0], LBIOPubKeyLen); if (LPrivateKeyLen = 0) or (LPublicKeyLen = 0) then Exit; SetLength(APrivateKey, LPrivateKeyLen); SetLength(APublicKey, LPublicKeyLen); Result := True; finally BIO_free(LBIOPriKey); BIO_free(LBIOPubKey); end; finally if LecGroup <> nil then EC_GROUP_free(LecGroup); end; finally if LecKey <> nil then EC_KEY_free(LecKey); end; end; 这个代码估计不符合国标,用的OpenSSL是1.1.1t的版本
----------------------------------------------
-
作者:
2023/3/25 16:48:48
16楼:
ECC和RSA不同。RSA的加解密中,公私钥地位确实是等同的,可以公加私解,也可以私加公解。算法都一样。 但ECC(包括SM2)的公私钥地位不等同,公加私解是规定,因为公钥是一个点坐标,能够按规定去计算点乘,但私钥不是点坐标,用私钥加密的行为大概是没有规范规定该如何做(除非自定义),也就没有公钥如何解的规范了。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2023/3/25 17:07:15
17楼:
@cnpack (CnPack) 谢谢大侠解惑,原来是这样。难怪没有通用的ECC加解密,只有ECC的签名和验签。
----------------------------------------------
-
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2023/3/26 9:33:10
18楼:
cnpack足矣!
----------------------------------------------
-我的博客
作者:
2023/3/26 10:58:51
19楼:
@inbreak (入侵) 现在的信息系统,普遍都要求使用国家商用密码标准,不再使用国外的3DES、MD5之类的加密方法。
----------------------------------------------
-
作者:
szlbz (秋风)
★☆☆☆☆
-
盒子活跃会员
2023/3/26 21:49:13
20楼:
在刘啸大神鼎力支持下,cnpack的国密等加密算法 (sm2/sm3/sm4/sm9)已可以在lazarus for 龙芯电脑等国产电脑使用。
----------------------------------------------
-
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2023/3/26 23:57:44
21楼:
现在还添加了AEAD,越来越完整了,大神赞!!!
----------------------------------------------
-
作者:
2023/3/27 8:36:23
22楼:
SM3、SM4: https://github.com/cnpack/cnvcl/Examples/Crypt SM2:https://github.com/cnpack/cnvcl/Examples/SM2
----------------------------------------------
delphi吾爱
作者:
2023/3/27 9:15:56
23楼:
楼主好人,感谢分享~~
----------------------------------------------
-
作者:
2023/3/27 13:50:00
24楼:
cnpack用过了
----------------------------------------------
-
作者:
2023/3/27 15:34:00
25楼:
代码重新略为调整了一下
----------------------------------------------
-
作者:
2023/3/27 17:17:49
26楼:
22楼感谢贴链接,不过我们近期为了支持多平台,调整了例子的目录结构,cnvcl的Example目录下,VCL/FMX/FPC三类例子分开存放了。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/3/27 17:24:45
27楼:
也感谢20楼提供龙芯环境供CnPack编译联调。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
szlbz (秋风)
★☆☆☆☆
-
盒子活跃会员
2023/3/27 21:26:49
28楼:
cnvcl的加密算法已支持多平台(linux/windowsx,CPU:X86_64、龙芯3A5000和aarch64)。感谢cnpack团队的辛勤付出!
----------------------------------------------
-
作者:
2cc (2cc)
▲△△△△
-
普通会员
2023/3/28 1:08:36
29楼:
@cnpack 有ChaCha20Poly1305吗?
----------------------------------------------
-
作者:
2023/3/28 7:44:40
30楼:
楼上,有。 cnvcl\Source\Crypto\CnChaCha20.pas 和 cnvcl\Source\Crypto\CnPoly1305.pas 例子同样在cnvcl\Example\VCL\Crypto
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/3/29 17:44:22
31楼:
又重新调整了一下源码
----------------------------------------------
-
作者:
lsuper (lsuper)
★☆☆☆☆
-
盒子活跃会员
2023/3/31 9:34:59
32楼:
赞一个;建议楼主在 github 开源,或统一到 cnpack 中,造福广大 delphier
----------------------------------------------
-
作者:
2023/4/4 11:28:12
33楼:
楼主的代码是目前公开代码中唯一直接用就与Java结果一致的代码。
----------------------------------------------
-
作者:
2023/7/14 10:31:36
34楼:
@ldmming cnpack也可以,不要说唯一,太绝对啦
----------------------------------------------
-
作者:
2023/7/14 13:02:54
35楼:
Java默认Utf8编码, cnpack使用Ansi编码, 对英文字符串进行加密两者一致, 但对中文字符串会不一致. TSM4默认使用Utf8编码
----------------------------------------------
-
作者:
2023/7/14 16:00:32
36楼:
感谢 楼主 与java 一致的 SM2 有吧?
----------------------------------------------
-
作者:
biznow (biznow)
★☆☆☆☆
-
盒子活跃会员
2023/7/14 16:07:57
37楼:
虽然已使用cnvcl,但还是要为楼主点赞! 感谢分享~
----------------------------------------------
-
作者:
2023/7/14 17:12:51
38楼:
@denkun SM2椭圆曲线加密算法比SM4要复杂很多, 还没写. SM3杂凑算法倒是写了:https://blog.csdn.net/BlueStorm/article/details/129949169
----------------------------------------------
-
作者:
2023/10/1 17:15:52
39楼:
谢谢分享
----------------------------------------------
-
作者:
2023/10/1 22:18:46
40楼:
CnPack因为要支持D5起的非Unicode版编译器到D11.3的Unicode编译器,故把编码事宜交给了调用者处理,内部不使用强制UTF8。 给出的例子中的默认编码用的是Ansi,例子中本身可以修改成UTF8来使用验证。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/10/30 21:05:05
41楼:
医保sm2签名是用这个吗 CnSM2SignData
----------------------------------------------
-
作者:
2023/10/30 21:10:54
42楼:
是用这个。注意待签名内容可能要UTF8编码。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/10/30 21:37:46
43楼:
字符串 写入流,然后转换成bytes,然后调用CnSM2SignData
----------------------------------------------
-
作者:
2023/11/3 16:04:38
44楼:
SM4
----------------------------------------------
-
作者:
2023/11/3 16:04:49
45楼:
SM3
----------------------------------------------
-
作者:
2023/11/4 17:48:59
46楼:
@CnPack 有人说CnPack里面有SM2的算法,你也说有,但是又有人说CnPack中的SM2不全,或者与其他语言的不一致,这个是怎么回事
----------------------------------------------
-
作者:
2023/11/4 19:09:28
47楼:
不全的地方请指出。 语言不一致的请看40楼回答。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/11/4 19:16:40
48楼:
好的,我还没有用,我只是在找,然后有人这么说的。等我这几天用到了看看。到时再请教
----------------------------------------------
-
作者:
2023/11/4 21:32:34
49楼:
感谢提供,下载学学备用
----------------------------------------------
你我,都可以是个造梦者!欢迎加入脚本引擎PaxCompiler交流群303904495http://www.cnblogs.com/fireboxsoft有需要错别字检测软件的朋友可以在我博客上的地址下载使用,备注“2ccc”的朋友可以免费获取超级黄金VVVVVVVVVVIP授权
作者:
2023/11/6 3:54:03
50楼:
用Demo里面的例子里面的函数 TestFp256SignExample TCnEccCurveType选用ctCustomized,或者ctSM2函数最终验签成功,其他的类型都不行,但是就算用的是ctCustomized,或者ctSM2,我用其他网站验签都不通过,目前不知道是第三方网站有问题,还是Cnapck的 我说的网站是这个https://const.net.cn/tool/sm2/verify/
----------------------------------------------
-
作者:
2023/11/6 12:13:28
51楼:
也许是UTF8的问题,我试一下看看
----------------------------------------------
-
作者:
2023/11/6 22:31:05
52楼:
不太懂,纯赞一个
----------------------------------------------
-
作者:
2023/11/7 10:36:41
53楼:
如果怀疑是utf8编码的问题,可以去掉待签名内容中的汉字试一下。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/