SM2介绍

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。
随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。
相比于RSA,SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小

算法流程

国家密码管理局-SM2椭圆曲线公钥密码算法
在上面的官方文件中详细描述了各个函数及其实现,包括函数实现过程中的数据类型转换(第1部分4.2 P5~7)
本文的算法为其中的素域下的公钥加密算法(第4部分:80 / 93)
加解密算法流程如图:

输入输出及部分函数和参数说明

1、加密

输入: 任意不含中文的字符串,本文采用了读文件的形式(可改),输入中若含有中文则会在解密后被转换成\x的16进制,最后验证也会False(听说可以decode后encode,但我试过好像没用
输出: 16进制字符串

2、解密

输入: 16进制字符串(三个)和椭圆曲线的参数
输出: 你输入的不明字符串

3、部分函数说明

addition(x1,y1,x2,y2,a,p):椭圆曲线E上的点在素域下的加法运算(第1部分P3,9 / 93),运算的时候不涉及椭圆曲线中的参数b所以就没加
mutipoint(x,y,k,a,p): 椭圆曲线E上的点在素域下的倍点运算(第1部分P22,28 / 93)
kdf(z,klen): 密钥派生函数(第4部分P4,87 / 93)

参数说明

椭圆曲线参数(a,b,p)和基点G及其阶n可改,官方推荐参数

源代码

运行前说明

运行环境:python3
Look 第3、4行的引用
第3行是之前的prime.py,实际上就一个模逆运算
第4行是SM3密码杂凑函数(SM3哈希函数)
所以光运行下面的代码肯定是会报错的
还有就是那些注释,是我验证的时候ctrl+c上去的,为啥不删?问就是懒
技术有限,仅供参考

真·代码

from random import randint
import math
from prime import modinv
from sm3 import sm3hashdef addition(x1,y1,x2,y2,a,p):if x1==x2 and y1==p-y2:return Falseif x1!=x2:lamda=((y2-y1)*modinv(x2-x1, p))%pelse:lamda=(((3*x1*x1+a)%p)*modinv(2*y1, p))%px3=(lamda*lamda-x1-x2)%py3=(lamda*(x1-x3)-y1)%preturn x3,y3def mutipoint(x,y,k,a,p):k=bin(k)[2:]qx,qy=x,yfor i in range(1,len(k)):qx,qy=addition(qx, qy, qx, qy, a, p)if k[i]=='1':qx,qy=addition(qx, qy, x, y, a, p)return qx,qydef kdf(z,klen):ct=1k=''for _ in range(math.ceil(klen/256)):k=k+sm3hash(hex(int(z+'{:032b}'.format(ct),2))[2:])ct=ct+1k='0'*((256-(len(bin(int(k,16))[2:])%256))%256)+bin(int(k,16))[2:]return k[:klen]#parameters
p=0x8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3
a=0x787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498
b=0x63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A
gx=0x421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D
gy=0x0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2
n=0x8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7
#待加密的消息M:encryption standard
#消息M的16进制表示:656E63 72797074 696F6E20 7374616E 64617264
'''
dB=0x1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0
xB=0x435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A
yB=0x75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42
'''
dB=randint(1,n-1)
xB,yB=mutipoint(gx,gy,dB,a,p)def encrypt(m:str):plen=len(hex(p)[2:])m='0'*((4-(len(bin(int(m.encode().hex(),16))[2:])%4))%4)+bin(int(m.encode().hex(),16))[2:]klen=len(m)while True:k=randint(1, n)while k==dB:k=randint(1, n)x2,y2=mutipoint(xB, yB, k, a, p)x2,y2='{:0256b}'.format(x2),'{:0256b}'.format(y2)t=kdf(x2+y2, klen)if int(t,2)!=0:breakx1,y1=mutipoint(gx, gy, k, a, p)x1,y1=(plen-len(hex(x1)[2:]))*'0'+hex(x1)[2:],(plen-len(hex(y1)[2:]))*'0'+hex(y1)[2:]c1='04'+x1+y1c2=((klen//4)-len(hex(int(m,2)^int(t,2))[2:]))*'0'+hex(int(m,2)^int(t,2))[2:]c3=sm3hash(hex(int(x2+m+y2,2))[2:])return c1,c2,c3def decrypt(c1,c2,c3,a,b,p):c1=c1[2:]x1,y1=int(c1[:len(c1)//2],16),int(c1[len(c1)//2:],16)if pow(y1,2,p)!=(pow(x1,3,p)+a*x1+b)%p:return Falsex2,y2=mutipoint(x1, y1, dB, a, p)x2,y2='{:0256b}'.format(x2),'{:0256b}'.format(y2)klen=len(c2)*4t=kdf(x2+y2, klen)if int(t,2)==0:return Falsem='0'*(klen-len(bin(int(c2,16)^int(t,2))[2:]))+bin(int(c2,16)^int(t,2))[2:]u=sm3hash(hex(int(x2+m+y2,2))[2:])if u!=c3:return Falsereturn hex(int(m,2))[2:]f=open('test.txt','r')
fstr=f.read()
f.close()
print(fstr)
c1,c2,c3=encrypt(fstr)
c=(c1+c2+c3).upper()
print('\nciphertext:')
for i in range(len(c)):print(c[i*8:(i+1)*8],end=' ')
print('\n\nplaintext:')
'''
输出密文C= C1∥C2∥C3:
04245C26 FB68B1DD DDB12C4B 6BF9F2B6 D5FE60A3 83B0D18D 1C4144AB F17F6252
E776CB92 64C2A7E8 8E52B199 03FDC473 78F605E3 6811F5C0 7423A24B 84400F01
B8650053 A89B41C4 18B0C3AA D00D886C 00286467 9C3D7360 C30156FA B7C80A02
76712DA9 D8094A63 4B766D3A 285E0748 0653426D
'''
m1=decrypt(c1, c2, c3, a, b, p)
if m1:m1=str(bytes.fromhex(m1))m1='\n'.join(m1[2:-1].split('\\n'))print(m1)print(fstr==m1)
else:print(False)

Python:SM2相关推荐

  1. 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用

    我们继续来进行国密算法的演示. 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用. 一 sm2算法的特点: sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的: 非对称加密算法,即有 ...

  2. python:flatten()参数详解

    python:flatten()参数详解 这篇博客主要写flatten()作用,及其参数的含义 flatten()是对多维数据的降维函数. flatten(),默认缺省参数为0,也就是说flatten ...

  3. Python:多指标权重确定方法—熵值法

    Python:多指标权重确定方法-熵值法 一.需准备的资料 1.一份excel的数据表格,列为指标(评价指标),行为城市(研究对象,也可以是年份,) city GDP:亿元x.1 人口(万)x.2 城 ...

  4. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  5. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  6. pyhton 安装pip 以及 numpy (解决python:ModuleNotFoundError:No module named numpy 等类似缺包问题

    https://blog.csdn.net/phs999/article/details/79218869 pyhton 安装pip 以及 numpy (解决python:ModuleNotFound ...

  7. 中文Python:中文编程不是梦

    我曾经与一位朋友讨论有没有可能用中文编程.当然计算机语言毕竟不是自然语言,但是目前大多数计算机语言(包括内置函数和库函数)都是基于英语的.所以,你会写System.PrintScreen(" ...

  8. python:未找到命令

    参考下面的文章: python:未找到命令_无色云的博客-CSDN博客https://blog.csdn.net/weixin_38669561/article/details/103010621这样 ...

  9. python:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes问题解决

    python:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes问题解决 参考文章: (1) ...

最新文章

  1. 模型(Model)– ASP.NET MVC 4 系列
  2. c++代码转为go_Go与C/C++ 互相调用
  3. CLR via C# 读书笔记 1-2 创建线程的成本
  4. C++中类的组合和继承关系
  5. 计算a[0]*a[1]*...*a[n-1]/a[i]
  6. mysql load average_紧急求助:load average太高了!!
  7. axios get post下载文件
  8. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
  9. Spring+springMvc+Mybatis
  10. jQuery之事件绑定到触发全过程及知识点补充
  11. SQL--报错回显注入
  12. .ipynb文件的使用问题
  13. c++ 创建txt,写log
  14. 翱翔云天的SAP技术课程体系
  15. 清明节如何计算(一千年清明节计算)
  16. 解决 ”To prevent a memory leak, the JDBC Driver has been forcibly unregistered“
  17. 【MySQL】不建议使用分区表
  18. 光盘自动播放 html,插入dvd光盘直接播放 禁用dvd菜单制作刻录dvd光盘 光盘直接放在DVD中就可以自动播放...
  19. [量子客]4月全球量子计算发展内参
  20. 手机内存卡应该叫外存卡

热门文章

  1. Rust交叉编译开发环境的搭建
  2. 2022年安装Windows7 x64 专业版系统更新提示错误代码80072EFE,解决办法【亲测有限】
  3. 对全文检索引擎xapian的学习(一)---索引
  4. 印象笔记使用(一)——微信篇
  5. 利用连按 5 下 Shift 漏洞破解 win7 开机密码(原理以及实现)
  6. java最强的mtk平台_手机QQ塞班S60/JAVA/MTK平台系统升级
  7. Unix macOS 编写 who 命令
  8. 米扑科技助力公益:寻找失踪儿童一起回家
  9. Acer 笔记本双硬盘安装Ubuntu18.04.4+Win10双系统
  10. Python自定义豆瓣电影种类,排行,点评的爬取与存储(高阶上)