导航:
论坛 -> 发布代码
斑竹:liumazi,ruralboy
作者:
2023/3/23 13:37:52
标题:
一个功能完备的国密SM4类(TSM4)
浏览:2034
加入我的收藏
楼主:
本软件使用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结果一致的代码。
----------------------------------------------
-