精华内容
下载资源
问答
  • 2021-10-17 19:48:40

    2021SC@SDUSC
    SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。
    SM2算法是一种椭圆曲线公钥密码算法,其密钥长度为256bit

    1参数产生

    素域上SM2选用 y 2 = x 3 + a x + b y^2=x^3+ax+b y2=x3+ax+b作为加密曲线,令 E ( F P ) = ( x , y ) ∣ y 2 = x 3 + a x + b ∪ O E(F_P)={(x,y)|y^2=x^3+ax+b}∪O E(FP)=(x,y)y2=x3+ax+bO, 包含了椭圆曲线上的所有点,其中O是一个无穷远点,不能用有序整数对(x,y)即仿射坐标表示,用 E ( F q ) E(F_q) E(Fq)表示 E ( F q ) E(F_q) E(Fq)上元素的个数,称为椭圆曲线的阶。SM2算法使用固定的 F p F_p Fp域,系统参数如下:

    F p F_p Fp域的特征p,p是大素数;
    F p F_p Fp中的两个元素a和b,它们定义曲线E的方程: y 2 = x 3 + a x + b y^2=x^3+ax+b y2=x3+ax+b,a、b满足 ( 4 a 3 + 27 b 2 ) m o d p ≠ 0 (4a^3+27b^2 )modp≠0 (4a3+27b2)modp=0

    基点 G = ( x G , y G ) ∈ E ( F P ) , G ≠ O G=(x_G,y_G)∈E(F_P ),G≠O G=(xG,yG)E(FP)G=O

    基点G的阶n,n是大素数,要求 n > 2 191 且 n > 4 p 1 ⁄ 2 n>2^{191}且n>4p^{1⁄2} n>2191n>4p12

    其中p、a、b、 x G x_G xG y G y_G yG和n均为m比特长度的大整数,也可以看作m/8字节长度的字符串,G可以看作一个有序整数对,也可以看作一个m/4字节长度的字符串。
    这几个参量的选择,直接影响了算法的安全性。若某椭圆曲线存在优于𝑛^(1∕2)级计算复杂度的攻击方法,则称此曲线为弱椭圆曲线,如Fa上的超奇异曲线(有限域Fa的特征整除q+1-#E(Fq))和 上的异常曲线(#𝐸(𝐹𝑝)=𝑝 )是弱椭圆曲线。在选取时应避开弱椭圆曲线。
    为了抗击Pollard-ρ攻击,所选取椭圆曲线的阶 的分解式中应该包含一个大的素数因子,目前应不小于160b比特。
    椭圆曲线参量值一般要求满足以下几个条件:

    (1)p越大越安全,但越大,计算速度会变慢;

    (2)p≠n×h(G为基点,n为点G的阶,h 称为余因子,是椭圆曲线上所有点的个数与n相除的整数部分,h≤4 ); 4 a 3 + 27 b 2 ≠ 0 ( m o d p ) 4a^3+27b^2≠0(modp) 4a3+27b2=0(modp)

    (3) p × t ≠ 1 ( m o d n ) , 1 ≤ t ≤ 20 p×t≠1(modn),1≤t≤20 p×t=1(modn)1t20 4 a 3 + 27 b 2 ≠ 0 ( m o d p ) 4a^3+27b^2≠0(modp) 4a3+27b2=0(modp)n 为素数。
    已知素域的规模p,求解比特串SEED及 中的元素a、b的步骤如下:

    (1)任意选择长度至少为192的比特串SEED;

    (2)计算 H = H 256 ( S E E D ) , 并 记 H = ( h 255 ; h 254 ; h 253 ; ⋅ ⋅ ⋅ ; h 0 ) H=H_{256} (SEED),并记 H=(h_{255};h_{254};h_{253};⋅⋅⋅;h_0 ) H=H256(SEED)H=(h255;h254;h253;;h0),H256是输出杂凑值长度为256比特的密码杂凑函数;

    (3)置 R = ∑ i = 0 255 h i 2 i R=∑_{i=0}^{255}h_i 2^i R=i=0255hi2i

    (4)置 r = R ( m o d p ) r=R(modp) r=R(modp)

    更多相关内容
  • SM2算法原理

    热门讨论 2012-06-05 07:53:02
    SM2算法原理,朋友亲自整理的,希望大家喜欢。
  • SM2算法原理及实现

    万次阅读 2018-02-05 14:25:00
    SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较...

    RSA算法的危机在于其纯在压指数算法,对ECC算法而言一般没有亚指数攻击算法

    SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥秒速昂发所需密钥长度小很多。

    ECC算法描述:

      1、用户A选定一条适合加密的椭圆曲线Ep(a,b)(如:y2=x3+ax+b),并取椭圆曲线上一点,作为基点G。   2、用户A选择一个私有密钥k,并生成公开密钥(公钥PB)K=kG。   3、用户A将Ep(a,b)和点(公钥)K,G传给用户B。   4、用户B接到信息后 ,将待传输的明文(M)编码到Ep(a,b)上一点M,并产生一个随机整数r(r<n)。加密开始   5、用户B计算点C1=M+rK;C2=rG。   6、用户B将C1、C2传给用户A。   7、用户A接到信息后,计算C1-kC2,结果就是点M。因为C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M   再对点M进行解码就可以得到明文。

      密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:   T=(p,a,b,G,n,h)。   (p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分)

      这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

      1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;

      2、p≠n×h;

      3、pt≠1 (mod n),1≤t<20;   4、4a3+27b2≠0 (mod p);   5、n 为素数;   6、h≤4。

    转载于:https://my.oschina.net/u/2611678/blog/1618556

    展开全文
  • SM2算法概述

    千次阅读 2021-10-10 19:05:22
    SM2算法概述 SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。 ...

     2021SC@SDUSC

    SM2算法概述

    SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。

    SM2标准包括总则,数字签名算法,密钥交换协议,公钥加密算法四个部分,并在每个部分的附录详细说明了实现的相关细节及示例。SM2算法主要考虑素域Fp和F2m上的椭圆曲线,分别介绍了这两类域的表示,运算,以及域上的椭圆曲线的点的表示,运算和多倍点计算算法。然后介绍了编程语言中的数据转换,包括整数和字节串,字节串和比特串,域元素和比特串,域元素和整数,点和字节串之间的数据转换规则。

    详细说明了有限域上椭圆曲线的参数生成以及验证,椭圆曲线的参数包括有限域的选取,椭圆曲线方程参数,椭圆曲线群基点的选取等,并给出了选取的标准以便于验证。最后给椭圆曲线上密钥对的生成以及公钥的验证,用户的密钥对为(s,sP),其中s为用户的私钥,sP为用户的公钥,由于离散对数问题从sP难以得到s,并针对素域和二元扩域给出了密钥对生成细节和验证方式。总则中的知识也适用于SM9算法。

    国密算法对比见下图:(来源见水印)

    SM2与RSA算法

    SM2算法和RSA算法都是公钥密码算法,SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

    对比:(来源见水印)

    安全性对比:

    速度对比:

    SM2算法数学基础

    主要内容来源是《密码学原理与实践 第三版》

    明文x(也就是初态w0)经过Nr轮加密后变成y,每一轮的加密通过轮函数g完成,g的实现需要两个输入子密钥K以及上一轮加密的结束状态。

    解密过程

    我的理解上图中的y其实是子密钥K,该函数的输入是子密钥K以及中间状态w。

     单射函数(来源:单射_百度百科

     SPN(代换-置换网络)是特殊的一类迭代密码。

    第一轮的输入需要初态w0与K1先异或得出u1再输入S盒。

    最后一轮不应用置换,需要Nr轮加密,但需要用到K(Nr+1)个子密钥。

    展开全文
  • SM2算法

    千次阅读 2022-03-23 19:18:25
    SM2是非对称加密算法 它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理...

    简述

    SM2是非对称加密算法

    它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。

    SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。随着密码技术和计算技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。SM2算法在安全性、性能上都具有优势。

    基础知识:椭圆曲线知识点、SM3算法

    获取公私钥:

    椭圆曲线方程: y 2 = x 3 + a x + b m o d    p y^2=x^3+ax+b \mod p y2=x3+ax+bmodp

    1. 确 认 a 、 b 、 p , 确 认 曲 线 。 确认a、b、p,确认曲线。 abp线
    2. 选 择 一 个 点 P ( x g , y g ) 为 基 点 。 选择一个点P(x_g,y_g)为基点。 P(xg,yg)
    3. 对 曲 线 做 切 线 、 x 对 称 点 运 行 。 次 数 为 d , 运 算 倍 点 为 Q 对曲线做切线、x对称点运行。次数为 d,运算倍点为Q 线线xd,Q
    4. d 为 私 钥 , Q 为 公 钥 d 为私钥,Q为公钥 d,Q

    密钥对的生成:

    1. 产 生 随 机 整 数 d [ 1 , n − 2 ] 产生随机整数 d [1,n-2] d[1,n2]
    2. G 为 基 点 , 计 算 点 P = ( x P , y P ) = [ d ] G ; G为基点,计算点 P=(xP,yP)=[d]G; GP=(xP,yP)=[d]G;
    3. 密 钥 对 为 : ( d , P ) 其 中 , d 为 私 钥 , P 为 公 钥 密钥对为: (d,P) 其中,d为私钥,P为公钥 :(d,P)dP

    一个很典型的例子:

    a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
    b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
    p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
    x_g = 0x32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
    y_g = 0xbc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0
    n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
    

    SM签名

    M M M为待签名消息,数字签名结果为 ( r , s ) (r,s) (r,s) ,用户密钥对 ( d , P ) (d,P) (d,P)

    实现步骤:

    1. e = h a s h ( M ) ⇒ 获 取 消 息 散 列 值 e=hash(M) \qquad \Rightarrow获取消息散列值 e=hash(M)
    2. 产 生 随 机 数 k ⇒ 以 便 即 使 是 同 一 个 消 息 , 每 次 签 名 出 来 的 结 果 不 同 。 产生随机数 k \qquad \Rightarrow以便即使是同一个消息,每次签名出来的结果不同。 k便使
    3. 使 用 随 机 数 , 计 算 椭 圆 曲 线 点 ( x 1 , y 1 ) = [ k ] G 使用随机数,计算椭圆曲线点(x_1,y_1)=[k]G 使线(x1,y1)=[k]G
    4. r = ( e + x 1 ) m o d    n ⇒ 判 断 : r = 0 或 者 r + k = n , 继 续 第 2 步 。 r=(e+x1) \mod n \qquad \Rightarrow判断:r=0 或者 r+k=n, 继续第2步。 r=(e+x1)modnr=0r+k=n,2
    5. s = ( ( 1 + d ) − 1 ∗ ( k − r ∗ d ) ) m o d    n , 若 s = 0 , 继 续 第 2 步 s= ((1+d)^{-1} * (k-r*d)) \mod n , 若s=0,继续第2步 s=((1+d)1(krd))modn,s=02
    6. r , s 为 签 名 信 息 。 r,s 为签名信息。 r,s

    SM验签

    M M M为明文, ( r , s ) (r,s) (r,s)为签名结果,用户公钥 P P P

    实现步骤:

    1. e = h a s h ( M ) e=hash(M) e=hash(M)
    2. t = ( r + s ) m o d    n t=(r+s) \mod n t=(r+s)modn
    3. ( x , y ) = [ s ] G + [ t ] P (x,y)=[s]G + [t]P (x,y)=[s]G+[t]P
    4. R = ( e + x ) m o d    n R=(e+x)\mod n R=(e+x)modn
    5. 计 算 R 是 否 等 于 r 计算R是否等于r Rr

    [ s ] G [s]G [s]G + [ t ] P [t]P [t]P的结果可以推导出等于 [ k ] G [k]G [k]G

    验证原理

    [ s ] G + [ t ] P ​ ​ = s G + ( r + s ) P [s]G+[t]P​​=sG+(r+s)P [s]G+[t]P=sG+(r+s)P
    = s G + ( r + s ) d G \qquad \qquad \quad=sG+(r+s)dG =sG+(r+s)dG
    = s G + s d ​ G + r d ​ G \qquad \qquad \quad=sG+sd​G+rd​G =sG+sdG+rdG
    = ( 1 + d ​ ) s G + r d ​ G \qquad \qquad \quad=(1+d​)sG+rd​G =(1+d)sG+rdG
    = ( 1 + d ​ ) ( 1 + d ) − 1 ( k − r d ) G + r d G \qquad \qquad \quad=(1+d​)(1+d)^{−1}(k−rd)G+rdG =(1+d)(1+d)1(krd)G+rdG
    = ( k − r d ​ ) G + r d ​ G \qquad \qquad \quad=(k−rd​)G+rd​G =(krd)G+rdG
    = k G − r d G + r d G \qquad \qquad \quad=kG−rdG+rdG =kGrdG+rdG
    = k G = ( x 1 ​ , y 1 ​ ) ​ \qquad \qquad \quad=kG=(x1​,y1​)​ =kG=(x1,y1)

    SM加密

    M为明文字符串

    1. 获 取 随 机 数 k 获取随机数 k k
    2. ( x 1 , y 1 ) = [ k ] G (x1, y1) = [k]G (x1,y1)=[k]G
    3. S = [ h ] P ⇒ h 为 余 因 子 S=[h]P \qquad \Rightarrow h为余因子 S=[h]Ph
    4. C 1 = ( x 2 , y 2 ) = [ k ] P C1=(x2,y2)= [k]P C1=(x2,y2)=[k]P
    5. t = K D F ( x 2 ∥ y 2 , k l e n ) ⇒ k l e n 为 M 的 长 度 。 K D F 是 s m 2 的 密 钥 派 生 函 数 t=KDF(x2\parallel y2,klen) \qquad \Rightarrow klen为M的长度。KDF是sm2的密钥派生函数 t=KDF(x2y2,klen)klenMKDFsm2
    6. C 2 = M + t C2 = M+t C2=M+t
    7. C 3 = H a s h ( x 2 ∥ M ∥ y 2 ) C3 = Hash(x2\parallel M\parallel y2) C3=Hash(x2My2)
    8. C = C 1 ∥ C 2 ∥ C 3 C = C1\parallel C2\parallel C3 C=C1C2C3

    SM解密

    C为密文字符串,klen为密文中C2的长度

    1. C 1 = C 里 面 获 取 , 验 证 C 1 是 否 满 足 椭 圆 曲 线 。 ⇒ C 2 长 度 确 定 , 可 以 获 取 C 1 内 容 。 C1 = C里面获取 ,验证C1是否满足椭圆曲线。 \qquad \Rightarrow C2长度确定,可以获取C1内容。 C1=CC1线C2C1
    2. S = [ h ] C 1 , S 为 无 穷 点 , 退 出 。 S=[h]C1,S为无穷点,退出。 S=[h]C1S退
    3. ( x 2 , y 2 ) = [ d ] C 1 (x2,y2)=[d]C1 (x2,y2)=[d]C1
    4. t = K D F ( m 2 ∥ y 2 , k l e n ) t=KDF(m2\parallel y2,klen) t=KDF(m2y2,klen)
    5. M ~ = C 2 + t \widetilde{M} = C2+t M =C2+t
    6. u = H a s h ( x 2 ∥ M ~ ∥ y 2 ) , u ? = = C 3 u=Hash(x2\parallel \widetilde{M} \parallel y2), u ?== C3 u=Hash(x2M y2),u?==C3
    7. M ~ 为 明 文 \widetilde{M}为明文 M

    代码实现

    首先,需要导入包gmssl

    pip install gmssl
    

    生成公私钥算法
    sm2utils.py

    from random import SystemRandom
    
    class CurveFp:
    	def __init__(self, A, B, P, N, Gx, Gy, name):
    		self.A = A
    		self.B = B
    		self.P = P
    		self.N = N
    		self.Gx = Gx
    		self.Gy = Gy
    		self.name = name
    
    sm2p256v1 = CurveFp(
    	name="sm2p256v1",
    	A=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC,
    	B=0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93,
    	P=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF,
    	N=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123,
    	Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7,
    	Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
    )
    
    def multiply(a, n, N, A, P):
    	return fromJacobian(jacobianMultiply(toJacobian(a), n, N, A, P), P)
    
    def add(a, b, A, P):
    	return fromJacobian(jacobianAdd(toJacobian(a), toJacobian(b), A, P), P)
    
    def inv(a, n):
    	if a == 0:
    		return 0
    	lm, hm = 1, 0
    	low, high = a % n, n
    	while low > 1:
    		r = high//low
    		nm, new = hm-lm*r, high-low*r
    		lm, low, hm, high = nm, new, lm, low
    	return lm % n
    
    def toJacobian(Xp_Yp):
    	Xp, Yp = Xp_Yp
    	return (Xp, Yp, 1)
    
    def fromJacobian(Xp_Yp_Zp, P):
    	Xp, Yp, Zp = Xp_Yp_Zp
    	z = inv(Zp, P)
    	return ((Xp * z**2) % P, (Yp * z**3) % P)
    
    def jacobianDouble(Xp_Yp_Zp, A, P):
    	Xp, Yp, Zp = Xp_Yp_Zp
    	if not Yp:
    		return (0, 0, 0)
    	ysq = (Yp ** 2) % P
    	S = (4 * Xp * ysq) % P
    	M = (3 * Xp ** 2 + A * Zp ** 4) % P
    	nx = (M**2 - 2 * S) % P
    	ny = (M * (S - nx) - 8 * ysq ** 2) % P
    	nz = (2 * Yp * Zp) % P
    	return (nx, ny, nz)
    
    def jacobianAdd(Xp_Yp_Zp, Xq_Yq_Zq, A, P):
    	Xp, Yp, Zp = Xp_Yp_Zp
    	Xq, Yq, Zq = Xq_Yq_Zq
    	if not Yp:
    		return (Xq, Yq, Zq)
    	if not Yq:
    		return (Xp, Yp, Zp)
    	U1 = (Xp * Zq ** 2) % P
    	U2 = (Xq * Zp ** 2) % P
    	S1 = (Yp * Zq ** 3) % P
    	S2 = (Yq * Zp ** 3) % P
    	if U1 == U2:
    		if S1 != S2:
    			return (0, 0, 1)
    		return jacobianDouble((Xp, Yp, Zp), A, P)
    	H = U2 - U1
    	R = S2 - S1
    	H2 = (H * H) % P
    	H3 = (H * H2) % P
    	U1H2 = (U1 * H2) % P
    	nx = (R ** 2 - H3 - 2 * U1H2) % P
    	ny = (R * (U1H2 - nx) - S1 * H3) % P
    	nz = (H * Zp * Zq) % P
    	return (nx, ny, nz)
    
    def jacobianMultiply(Xp_Yp_Zp, n, N, A, P):
    	Xp, Yp, Zp = Xp_Yp_Zp
    	if Yp == 0 or n == 0:
    		return (0, 0, 1)
    	if n == 1:
    		return (Xp, Yp, Zp)
    	if n < 0 or n >= N:
    		return jacobianMultiply((Xp, Yp, Zp), n % N, N, A, P)
    	if (n % 2) == 0:
    		return jacobianDouble(jacobianMultiply((Xp, Yp, Zp), n // 2, N, A, P), A, P)
    	if (n % 2) == 1:
    		return jacobianAdd(jacobianDouble(jacobianMultiply((Xp, Yp, Zp), n // 2, N, A, P), A, P), (Xp, Yp, Zp), A, P)
    
    class PrivateKey:
    	def __init__(self, curve=sm2p256v1, secret=None):
    		self.curve = curve
    		self.secret = secret or SystemRandom().randrange(1, curve.N)
    
    	def publicKey(self):
    		curve = self.curve
    		xPublicKey, yPublicKey = multiply((curve.Gx, curve.Gy), self.secret, A=curve.A, P=curve.P, N=curve.N)
    		return PublicKey(xPublicKey, yPublicKey, curve)
    
    	def toString(self):
    		return "{}".format(str(hex(self.secret))[2:].zfill(64))
    
    class PublicKey:
    	def __init__(self, x, y, curve):
    		self.x = x
    		self.y = y
    		self.curve = curve
    
    	def toString(self, compressed=True):
    		return {
    			True:  str(hex(self.x))[2:],
    			False: "{}{}".format(str(hex(self.x))[2:].zfill(64), str(hex(self.y))[2:].zfill(64))
    		}.get(compressed)
    
    
    if __name__ == "__main__":
        priKey = PrivateKey()
        pubKey = priKey.publicKey()
        print(priKey.toString())
        print(pubKey.toString(compressed = False))
    

    加解密算法
    封装类 sm2encryp.py

    from gmssl import sm2
    from base64 import b64encode, b64decode
    # sm2的公私钥
    SM2_PRIVATE_KEY = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'
    SM2_PUBLIC_KEY = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'
    
    sm2_crypt = sm2.CryptSM2(public_key=SM2_PUBLIC_KEY, private_key=SM2_PRIVATE_KEY)
    
    
    class sm2Encrypt:
        # 加密
        def encrypt(self, info):
            encode_info = sm2_crypt.encrypt(info.encode(encoding="utf-8"))
            encode_info = b64encode(encode_info).decode()  # 将二进制bytes通过base64编码
            return encode_info
    
        # 解密
        def decrypt(self, info):
            decode_info = b64decode(info.encode())  # 通过base64解码成二进制bytes
            decode_info = sm2_crypt.decrypt(decode_info).decode(encoding="utf-8")
            return decode_info
    
    
    if __name__ == "__main__":
        origin_pwd = '123456'
        sm2 = sm2Encrypt()
        # 加密的密码
        encrypy_pwd = sm2.encrypt(origin_pwd)
        print(encrypy_pwd)
        # 解密的密码
        decrypt_pwd = sm2.decrypt(encrypy_pwd)
        print(decrypt_pwd)
    

    当跟sm2encryp.py在一个文件夹是可以直接引用它

    from sm2encryp import sm2Encrypt
    pass_encrypt = sm2Encrypt()
    pwd = pass_encrypt.decrypt("H24OlVZgSTtevCW138O+C5PlZp8OiD920JnpVr7r9ndkGBWFZUVDD48iIVrZRnamgosV5910m9k0438WpIyi0guEt8F5inG7Y5A51whRfdPZ+qdvWVQxI857CBEzkb3h1bMp1ETQ")
    print(pwd)
    

    参考

    https://www.jianshu.com/p/efc43060e0aa
    https://blog.csdn.net/u013137970/article/details/84573200
    https://blog.csdn.net/u014651560/article/details/113744296

    展开全文
  • SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较...
  • 国密算法SM2介绍

    万次阅读 2019-11-28 14:56:23
    基于椭圆曲线的离散对数难题,目前 SM2 256 bit 加密算法是相当安全的,相当于 RSA 2048 bit 及以上的安全性 有公钥、私钥之分,公钥给别人,可以在一定范围内公开,私钥留给自己,必须保密。由私钥可以计算公钥;由...
  • 学习笔记——SM2算法原理及实现

    千次阅读 2018-01-26 15:52:00
    SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较...
  • 国密SM2算法流程概述

    千次阅读 2018-12-25 18:41:20
    SM2的主要功能 A1. 公私钥 私钥:BN_大整数 公钥:EC-Point 椭圆曲线上的点 整体结构 A.2 数字签名算法 A.2.1 签名(User A) l 签名者用户A的密钥对包括其私钥dA和公钥PA=[dA]G= (xA,yA) 签名者用户A具有长度为...
  • 国密SM2算法

    万次阅读 多人点赞 2018-11-27 20:46:39
    目录1 前言2 基础参数3 密钥对生成4 签名算法4.1 预处理14.2 预处理24.3 生成签名4.4 签名验证4.5 签名验证原理5 参考资料 1 前言 比原链的智能合约支持国密算法的函数。SM2是国密标准的椭圆曲线加密算法,遵循以下...
  • 2021SC@SDUSC 2. 基点的确定 根据前面得到的参数p,a,b 和n,利用下面的算法可以求出具有大素数阶的基点。 当参数a、b、p确定,这条曲线 就定下来了。先随机产生0到p-1间的整数作为基点x坐标,计算x3+ax+bx^3+ax+...
  • 密码学算法之 SM2国密算法

    万次阅读 热门讨论 2019-03-05 10:08:51
    一、SM2 国密算法介绍: &quot;&quot;&quot; SM2 国密非对称加密算法,属于椭圆曲线密码体制(ECC) Author:John 基于椭圆曲线的离散对数难题,目前 SM2 256 bit 加密算法是相当安全的,相当于 RSA ...
  • 详解国密SM2的加密和解密

    万次阅读 热门讨论 2020-03-25 21:25:26
    在上一篇文章《解读国密非对称加密算法SM2》介绍了国密非对称算法SM2,在文章中说到,如果现有的网络库中已经实现ECC算法,只需加入SM2命名曲线的参数...
  • openssl SM2签名密钥生成

    千次阅读 2021-05-08 23:36:48
    1 生成sm2私钥: openssl ecparam -genkey -name SM2 -out sm2PriKey.pem 2 sm2私钥导出公钥: openssl ec -in sm2PriKey.pem -pubout -out sm2PubKey.pem 3 查看私钥: openssl ec -in sm2PriKey.pem -text 4 私钥pkcs...
  • ECC,SM2理解

    千次阅读 2020-01-11 11:13:10
    https://www.jianshu.com/p/d4f948b5eba5
  • SM2算法原理与实现_密码学源代码_C语言程序_C++程序源代码
  • 图解SM2算法流程——第3章 密钥协商

    万次阅读 2018-06-22 11:08:46
    A.3 第3部分——密钥交换协议 A.3.1 密钥交换(User A &amp; User B) A.3.2 原理 参与KDF运算的所有输入数据均相等,所以得到的协商密钥自然相同。
  • 国家密码管理局颁布的t椭圆曲线密码算法SM2的全套资料,包括数据加解密、消息签名验证的标准和测试向量,以及必备的基础知识。
  • SM2C256VQ100开发板原理
  • SM2公钥加解密算法浅析

    万次阅读 2018-08-08 16:39:58
     椭圆曲线:是一类二元多项式方程,它的解构成一个椭圆曲线。...所以,SM2算法想要成功解密,必须使用与加密公钥对于的私钥,这样才能通过密钥派生函数计算出的异或比特串才能和加密时计算的异或比特串完全一致。
  • 图解SM2算法流程——第2章 签名验签

    千次阅读 2018-12-11 15:26:32
    A.2.3 原理 首先,验证流程B4计算的点(x′1; y′1) 和签名步骤A3 计算的点 ( x1, y1 )相等。 计算流程 (x′1; y′1) = [s′]G + [t]PA = [s′]G + [s′] PA + [r′] PA = [s′]G +[s′][dA] G +[r′...
  • SM2算法简介

    2014-05-20 09:42:19
    SM2算法是一种什么样的加密算法,有什么特点,如何进行应用?本文整理在SM2应用实践中遇到的问题,供大家分享。 
  • SM2算法第九篇:SSL协议详解

    千次阅读 2016-05-16 17:26:39
     Diffie-Hellman密钥交换算法原理: (1)Alice与Bob确定两个大素数n和g,这两个数不用保密 (2)Alice选择另一个大随机数x,并计算A如下:A=gx mod n (3)Alice将A发给Bob (4)Bob 选择另一个大...
  • SM2是国密算法的一部分,于2010年由国密局公布,属于非对称加密算法,本身是基于ECC椭圆曲线算法来实现的。 本文重在理清ECC算法的来龙去脉,关于无穷远点、摄影平面坐标系、Fp有限域、阿贝尔群等概念,要重点学习...
  • SM2算法标准规范,帮助学习国密SM2算法原理
  • SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,基于ECC。其签名速度与秘钥生成速度都快于RSA,非对称加密,该算法已公开 SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局...
  • SM2算法第一篇:ECC加密算法

    万次阅读 多人点赞 2016-04-17 20:55:35
    SM2椭圆曲线公钥密码算法本身是基于ECC椭圆曲线算法的,所以要搞sm2, 先要弄懂ECC。 这里学习ECC椭圆曲线算法,主要参考了一位前辈的技术博客,网名为ZMWorm 的大牛在多年前写的《椭圆曲线ECC加密算法入门介绍》...
  • RSA及SM2算法简介.zip

    2019-12-17 13:23:57
    详细阐述应用最广泛的两个非对称加密算法RSA和SM2原理及特性,他们一个是国际标准密码算法,一个是国家商用密码算法,RSA在国际上普遍使用,而SM2安全性和性能更好,在国内也已逐步推广,并已纳入国际密码标准算法库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,558
精华内容 623
关键字:

sm2原理