- 博客(11)
- 收藏
- 关注
原创 Fabric 2.1 国密改造详解 —— (一)
Fabric 2.1 国密改造笔记(详解)(一) ——总体思路源代码:https://github.com/paul-lee-attorney/fabric-2.1-gm导入的国密算法原创代码: https://github.com/ZZMarquis/gm联系方式:paul_lee0919@163.com声明: 源代码仅仅做了单元测试,没有做编译、Docker等系统测试。哪位大牛会做,帮忙测试一下。有啥问题,帮忙指教一下!非常感谢!; )基于业务需要和个人兴趣,尝试着基于Fabric 2
2020-11-06 19:22:28 2218 2
原创 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)
国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)原创代码:https://github.com/ZZMarquis/gm引用时,请导入原创代码库。本文仅以注释方式详解代码逻辑,供学习研究使用。对原创代码的修改内容修改了部分常量、变量、结构体属性的名称, 以便与GO语言标准包规范相统一加入中文注释,解释代码逻辑注释者及联系邮箱Paul Leepaul_lee0919@163.com国标(GMT 0003.3-2012, 以下简称“国标”) 规定的SM2算法秘钥
2020-10-30 18:14:49 2214
原创 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)
SignToRS( ) 为SM2签名算法的核心函数: - 以私钥(d倍数)为基础推算公钥点PA(XA, YA) - 调用预处理函数获取H值 - 调用标准包crypto/rand获取随机数k - 推算曲线点(x1, y1) = [k]G - 调用标准包math/big封装的加和取模函数计算r = (e + x1) mod n, 并校验r<>0, 且r+k<>n - 调用标准包math/big封装的取乘法逆元和取模函数计算s = ((1+d)^(-1) * (k - rd)) mod n
2020-10-15 16:52:49 3165 2
原创 国密算法Go语言实现(详解)(八) ——SM2(椭圆曲线公钥密码算法)
Encrypt( ) 为SM2加密函数: - 生成随机数k, k属于区间[1,N-1] - 利用标准包elliptic的方法CurveParams.ScalarBaseMult()生成倍点C1=kG=(c1x, c1y) - 由于SM2推荐曲线余因子h=1,此时,点S=[h]PB就是公钥PB点,不可能为无穷远点O- 利用标准包elliptic的方法CurveParams.ScalarBaseMult()生成倍点kPB=(kPBx, kPBy)- 调用改进后的秘钥派生函数kdf(), 生成C2
2020-10-15 16:30:26 2699 1
原创 国密算法Go语言实现(详解)(七) ——SM2(椭圆曲线公钥密码算法)
以上为SM2算法公钥类和私钥类的定义,其中: 1. 不论是公钥类还是私钥类,均将其基础椭圆曲线定义作为基本属性 2. 公钥为曲线上的一个点P,因此,其特征值指向P点坐标(X, Y) 3. 私钥为公钥点P相对于基点G的倍数,因此,其特征值指向倍数D
2020-10-15 16:12:40 2918
原创 国密算法Go语言实现(详解)(六) ——SM2(椭圆曲线公钥密码算法)
P256V1Curve 代表国密SM2推荐的椭圆曲线: 1. 素数域256位椭圆曲线 2. 方程为 Y^2 = X^3 + aX + b 3. 其他参数: p, a, b, n, Gx, Gy 详见国标 4. 在GO语言标准库elliptic的CurveParams类的基础上增加了参数a的属性 5. 由于参数符合a=p-3, 所以曲线方程等价于 Y^2 = X^3 - 3X + b (mod p) 6. 可直接适用标准库elliptic的公共方法(注释者未完成严谨数学验证)
2020-10-15 15:07:40 5043
原创 国密算法Go语言实现(详解)(五) ——SM4(分组算法)
r( ) 为国标(7.1.(b))定义的反序变换函数: 1. 两个二进制数A0和B0, 初次异或运算结果为A1, 则A1=A0^B0; 2. A1与B0进行第二次异或运算结果为B1,则B1=A1 ^ B0 = A0 ^ B0 ^ B0 = A0; 3. A1与B1进行第三次异或运算结果为A2,则A2 = A1 ^ B1 = A0 ^ B0 ^ A0 = B0; 4. 若A、B均为变量,将A0/A1/A2均用变量A存储,B0/B1均用变量B存储,则上述计算可简述为:三次异或运算交换变量值。
2020-10-14 18:46:11 1932
原创 国密算法Go语言实现(详解)(四) ——SM4(分组算法)
若将Sbox二维表逐行展开为一维数组s[],则数组元素的序号就是Sbox行序号乘16加列序号;1个字节存储单元能够存储2位16进制数, 若将其所表示的二进制数字a,折算成16进制数字(设为EF),然后将其高位E作为行坐标、将低位F作为列坐标,则数字a就可以用来表示Sbox二维表中某个元素的行列坐标(E,F); Sbox二维表展开成数组s[ ]后,其数组序号就是Ex16 + F,这其实就是数字a的值. 所以, 根据SM4国标定义的非线性变换τ(.),Sbox(a)=s[a]
2020-10-14 16:43:08 3636
原创 国密算法Go语言实现(详解)(三) ——SM3(杂凑算法)
p0() 为国标4.4条规定的置换函数。值得称道的是,作者直接引入了GO语言标准库bits.RotateLeft32()方法,简化了代码。
2020-10-14 16:21:21 1177
原创 国密算法Go语言实现(详解)(二) ——SM3(杂凑算法)
Write() 为SM3哈希摘要的“写”方法,是GO语言hash类的标准接口方法,为公共方法,可外部调用。其功能旨在将输入消息按照SM3国标规定的分组、迭代、压缩函数整理写入8个"字"寄存器。鉴于输入消息写入时可能为**多次、持续**的过程,所以,Write()方法并没有将国标中规定的对输入消息尾部的**填充操作**考虑在内,而是将“填充”步骤放到最后,在收尾函数finish()方法中再实现输入消息的“填充”步骤。
2020-10-14 16:06:18 1499
原创 国密算法Go语言实现(详解)(一) ——SM3(杂凑算法)
国密算法Go语言实现(详解)(一) ——SM3(杂凑算法)出于律师的职业病,严格依据国密局公布的国家标准,对国密GO语言实现代码库进行了核实验证。在验证代码的过程中,发现了大牛ZZMarquis开发的这个GM包,逻辑清晰、充分借用了go语言标准库的既有模块,而且可以看出,基于国密推荐的加密参数结合近世代数理论,已经对算法和代码进行了相当程度的效率优化。将学习代码逻辑、核对国标验算过程的注释,连同源代码一并在此发布,希望对后来者能有些帮助。
2020-10-14 15:09:20 3477 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人