DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: v999v
今日帖子: 2
在线用户: 32
导航: 论坛 -> 发布代码 斑竹:liumazi,ruralboy  
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/3/23 13:37:52
标题:
一个功能完备的国密SM4类(TSM4) 浏览:4543
加入我的收藏
楼主: 本软件使用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
此帖子包含附件:bluestorm8_2023323133752.zip 大小:63.2K
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/3/23 13:39:07
1楼: 截图
此帖子包含附件:
PNG 图像
大小:19.9K
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
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;
----------------------------------------------
-
作者:
男 movedown (movedown) ★☆☆☆☆ -
普通会员
2023/3/23 15:45:23
3楼: 感谢分享!
----------------------------------------------
-
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
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
----------------------------------------------
-
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2023/3/24 8:53:17
7楼: 好东西
----------------------------------------------
-
作者:
男 xjia (xjia) ★☆☆☆☆ -
盒子活跃会员
2023/3/24 11:11:48
8楼: 感谢分享~~
----------------------------------------------
-
作者:
男 newsxy (呼呼) ★☆☆☆☆ -
盒子活跃会员
2023/3/24 21:42:33
9楼: 感谢分享,先收藏
----------------------------------------------
-
作者:
男 wfbhappy (波波) ★☆☆☆☆ -
普通会员
2023/3/24 21:47:45
10楼: SM2也可以搞搞,
根据SM2算法(Signature的algorithm选择SM3withSM2),签名报文。通过对报文数据筛选、排序和拼接,组成待签名报文数据。  这个能做个例子吗
----------------------------------------------
长兴波波
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
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
此帖子包含附件:
PNG 图像
大小:1.18M
----------------------------------------------
-
作者:
男 inbreak (入侵) ★☆☆☆☆ -
盒子活跃会员
2023/3/25 12:07:01
12楼: 弱弱的问一句,有什么用?
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
作者:
男 wfbhappy (波波) ★☆☆☆☆ -
普通会员
2023/3/25 14:53:05
13楼: 用处大了,医保对接全部用的国密 SM2  SM4,医疗系统delphi软件对这个是刚需
----------------------------------------------
长兴波波
作者:
男 wfbhappy (波波) ★☆☆☆☆ -
普通会员
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的版本
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
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足矣!
----------------------------------------------
-我的博客
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
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,越来越完整了,大神赞!!!
----------------------------------------------
-
作者:
男 xianguo (Encina) ★☆☆☆☆ -
盒子活跃会员
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吾爱
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2023/3/27 9:15:56
23楼: 楼主好人,感谢分享~~
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/3/27 13:50:00
24楼: cnpack用过了
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/3/27 15:34:00
25楼: 代码重新略为调整了一下
此帖子包含附件:bluestorm8_202332715340.zip 大小:61.1K
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/27 17:17:49
26楼: 22楼感谢贴链接,不过我们近期为了支持多平台,调整了例子的目录结构,cnvcl的Example目录下,VCL/FMX/FPC三类例子分开存放了。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
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吗?
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
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/
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/3/29 17:44:22
31楼: 又重新调整了一下源码
此帖子包含附件:bluestorm8_2023329174422.zip 大小:61.0K
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2023/3/31 9:34:59
32楼: 赞一个;建议楼主在 github 开源,或统一到 cnpack 中,造福广大 delphier
----------------------------------------------
-
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
2023/4/4 11:28:12
33楼: 楼主的代码是目前公开代码中唯一直接用就与Java结果一致的代码。
----------------------------------------------
-
作者:
男 yangyachao (常安宁) ▲▲△△△ -
普通会员
2023/7/14 10:31:36
34楼: @ldmming
cnpack也可以,不要说唯一,太绝对啦
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/7/14 13:02:54
35楼: Java默认Utf8编码, cnpack使用Ansi编码, 对英文字符串进行加密两者一致, 但对中文字符串会不一致.

TSM4默认使用Utf8编码
----------------------------------------------
-
作者:
男 denkun (dk) ★☆☆☆☆ -
普通会员
2023/7/14 16:00:32
36楼: 感谢 楼主 与java 一致的 SM2 有吧?
----------------------------------------------
-
作者:
男 biznow (biznow) ★☆☆☆☆ -
盒子活跃会员
2023/7/14 16:07:57
37楼: 虽然已使用cnvcl,但还是要为楼主点赞!

感谢分享~
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/7/14 17:12:51
38楼: @denkun SM2椭圆曲线加密算法比SM4要复杂很多, 还没写.
SM3杂凑算法倒是写了:https://blog.csdn.net/BlueStorm/article/details/129949169
----------------------------------------------
-
作者:
男 slan06 (slan) ▲▲△△△ -
普通会员
2023/10/1 17:15:52
39楼: 谢谢分享
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/10/1 22:18:46
40楼: CnPack因为要支持D5起的非Unicode版编译器到D11.3的Unicode编译器,故把编码事宜交给了调用者处理,内部不使用强制UTF8。

给出的例子中的默认编码用的是Ansi,例子中本身可以修改成UTF8来使用验证。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/10/30 21:05:05
41楼: 医保sm2签名是用这个吗 CnSM2SignData
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/10/30 21:10:54
42楼: 是用这个。注意待签名内容可能要UTF8编码。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/10/30 21:37:46
43楼: 字符串 写入流,然后转换成bytes,然后调用CnSM2SignData
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/11/3 16:04:38
44楼: SM4
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/11/3 16:04:49
45楼: SM3
----------------------------------------------
-
作者:
男 wuxi15 (似水·流年) ▲▲▲▲▲ -
普通会员
2023/11/4 17:48:59
46楼: @CnPack 有人说CnPack里面有SM2的算法,你也说有,但是又有人说CnPack中的SM2不全,或者与其他语言的不一致,这个是怎么回事
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/11/4 19:09:28
47楼: 不全的地方请指出。
语言不一致的请看40楼回答。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 wuxi15 (似水·流年) ▲▲▲▲▲ -
普通会员
2023/11/4 19:16:40
48楼: 好的,我还没有用,我只是在找,然后有人这么说的。等我这几天用到了看看。到时再请教
----------------------------------------------
-
作者:
男 isxuzhu (e.Wong) ★☆☆☆☆ -
盒子活跃会员
2023/11/4 21:32:34
49楼: 感谢提供,下载学学备用
----------------------------------------------
你我,都可以是个造梦者!欢迎加入脚本引擎PaxCompiler交流群303904495http://www.cnblogs.com/fireboxsoft有需要错别字检测软件的朋友可以在我博客上的地址下载使用,备注“2ccc”的朋友可以免费获取超级黄金VVVVVVVVVVIP授权
作者:
男 wuxi15 (似水·流年) ▲▲▲▲▲ -
普通会员
2023/11/6 3:54:03
50楼: 用Demo里面的例子里面的函数 TestFp256SignExample
 TCnEccCurveType选用ctCustomized,或者ctSM2函数最终验签成功,其他的类型都不行,但是就算用的是ctCustomized,或者ctSM2,我用其他网站验签都不通过,目前不知道是第三方网站有问题,还是Cnapck的
我说的网站是这个https://const.net.cn/tool/sm2/verify/
----------------------------------------------
-
作者:
男 wuxi15 (似水·流年) ▲▲▲▲▲ -
普通会员
2023/11/6 12:13:28
51楼: 也许是UTF8的问题,我试一下看看
----------------------------------------------
-
作者:
男 coolmyf (greentea) ★☆☆☆☆ -
普通会员
2023/11/6 22:31:05
52楼: 不太懂,纯赞一个
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/11/7 10:36:41
53楼: 如果怀疑是utf8编码的问题,可以去掉待签名内容中的汉字试一下。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行117.1875毫秒 RSS