一.实验报告

二.代码

#Fp-256上椭圆曲线消息加密
import math
import hashlib
import binascii
p = 0x8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3
a = 0x787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498
b = 0x63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A
x_G = 0x421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D
y_G = 0x0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2
n = 0x8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7
x_B = 0x435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A
y_B = 0x75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42
d_B = 0x1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0#随机产生1<=k<=n-1
k = 0x4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F
def ext_gcd(a, b): #扩展欧几里得算法 ,即 a mod b 的逆元,返回的第一个值为结果if b == 0:return 1,0,aelse:x, y, gcd = ext_gcd(b, a % b) #递归直至余数等于0(需多递归一层用来判断)x, y = y, (x - (a // b) * y) #辗转相除法反向推导每层a、b的因子使得gcd(a,b)=ax+by成立return x,y,gcd
def sameAdd(x1,y1):lamda1 = (3 * (x1 * x1)%p + a)%plamda2 = ext_gcd((2 * y1) % p,p)[0]lamda = (lamda1 * lamda2) % px3 = ((lamda * lamda) % p - x1 - x1) % py3 = ((lamda * (x1 - x3)%p) % p - y1) % preturn x3,y3
def NsameAdd(x1,y1,x_G,y_G):lamda1 = (y_G - y1) % plamda2 = ext_gcd((x_G - x1) % p,p)[0]lamda = (lamda1 * lamda2) % px3 = ((lamda * lamda) % p - x1 - x_G) % py3 = ((lamda * (x1 - x3)%p) % p - y1) % preturn x3,y3
def multiply(x1,y1,k,x_G,y_G):if k == 2:return sameAdd(x1,y1)if k == 3:x1,y1 = sameAdd(x1,y1)return NsameAdd(x1,y1,x_G,y_G)if k % 2 == 0:x1,y1 = multiply(x1, y1, k // 2,x_G,y_G)x1,y1 = sameAdd(x1,y1)return x1,y1if k % 2 == 1:x1,y1 = multiply(x1, y1, (k - 1) // 2,x_G,y_G)x1,y1 = sameAdd(x1,y1)x1,y1 = NsameAdd(x1,y1,x_G,y_G)return x1,y1
def Point_bit(x1,y1):X1 = bin(x1)[2:].zfill(256)Y1 = bin(y1)[2:].zfill(256)return '00000100' + X1 + Y1  #选用未压缩格式
def SHA256(str):m = hashlib.sha256()  # 构建sha256对象m.update(str.encode(encoding='utf-8'))  # 设置编码格式str_sha256 = m.hexdigest()  # hexdigest()将加密字符串 生成十六进制数据字符串值return str, str_sha256
def KDF(x,klen):ct = 0x00000001K = ""for i in range(1,klen // 256):  # 调用的SHA256哈希函数,故v = 256ct = ct + 1K = K + SHA256(x+bin(ct)[2:].zfill(32))[1]if klen % 256 != 0:K = K + SHA256(x+bin(ct)[2:].zfill(32))[1][:(klen-256*int(klen // 256))//4]else:K = K + SHA256(x+bin(ct)[2:].zfill(32))[1]K = bin(int(K, 16))[2:].zfill(klen) #16进制字符串转2 进制return K
def xor(bit_M,t):res = ""for i in range(len(bit_M)):add = int(bit_M[i]) + int(t[i])if add == 1:res = res + "1"else:res = res + "0"return res
def bit_Point(hexC1):#为什么!这么简单的问题那本书上回答的如此晦涩难懂!x = int(hexC1[-128:-64], 16)y = int(hexC1[-64:], 16)if int(hexC1[:2], 16) == 4:return x, y
def Point_C1_in(Point_C1):x,y = Point_C1# y*y=x*x*x+a*x+b 检测方程temp1 = y * y % ptemp2 = (x * x * x + a * x + b) % pif temp1 == temp2:return 1return 0
if __name__=="__main__":x1 = x_Gy1 = y_Gx2 = x_By2 = y_BM_str = b'And now here is my secret, a very simple secret. It is only with the heart that one can see rightly; what is essential is invisible to the eyes. 'print("明文是: " + str(M_str))Q_1 = bytes.hex(M_str)M = int(Q_1,16)#M = hex(Q_2)# print(Q_1)# print(Q_3)#M = hex(AA)# print(type(AA))#M = 0x656E6372797074696F6E207374616E64617264 #明文x1,y1 = multiply(x1,y1,k,x_G,y_G) #计算椭圆曲线点C1=[k]G=(x1,y1)C1_Bit = Point_bit(x1,y1) #将C1数据类型转换为字符串#所给公钥一定会满足条件,故未验证x2,y2 = multiply(x2,y2,k,x_B,y_B)#计算椭圆曲线点[k]PB=(x2,y2)bit_x2 = bin(x2)[2:].zfill(256)bit_y2 = bin(y2)[2:].zfill(256)# t=KDF(x2||y2,Mlen)  KDF 是密钥派生函数bit_M = bin(M)[2:]bit_M = (8 - len(bit_M) % 8) * '0' + bit_Mt = KDF(bit_x2 + bit_y2, len(bit_M))C2 = xor(bit_M,t)#计算C2 = M ⊕ tC3 = SHA256(bit_x2 + bit_M + bit_y2)# C3=Hash(x2||M||y2)hexC1=hex(int(C1_Bit,2))[2:].zfill(130) #拓展到130位hexC2 = hex(int(C2, 2))[2:].zfill(len(bit_M) // 4)C = hexC1 + hexC2 + C3[1] #生成密文咯!!print("密文是: " + str(C))#下面进行解密工作Point_C1 =  bit_Point(hexC1) #将C1转化为椭圆曲线上的点if(1 - Point_C1_in(Point_C1)): #看点是否在椭圆曲线上exit("坏了,错了!")#无穷远点在这里并没有考虑x2,y2 = Point_C1x2,y2 = multiply(x2,y2,d_B,Point_C1[0],Point_C1[1]) #计算倍点并转化为2进制数比特串bit_x2 = bin(x2)[2:].zfill(256)bit_y2 = bin(y2)[2:].zfill(256)t = KDF(bit_x2 + bit_y2,len(C2))MM = xor(C2,t)  #计算M ′ = C2 ⊕ tbegin = 0MM_ming_bin = ''for i in  MM:if i == '1':begin = 1if begin == 1:MM_ming_bin += iMM_ming = bytes.fromhex(hex(int(MM_ming_bin,2))[2:])# print(hex(int(MM_ming,2)))print("解密生成的字符串为: " + str(MM_ming))

SM2椭圆曲线公钥加密算法相关推荐

  1. SM1 SM2 SM3 SM4加密算法

    2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,这其中就包括 SM1.SM2.SM3 .SM4.SM7.SM9.ZUC(祖冲之加密算法)等,SM 代表商密,即商业密码,是指 ...

  2. SM2椭圆曲线公钥密码算法(Python实现)

    本文目录 一.实验目的(包括实验环境.实现目标等等) 1. 实验环境 2. 实现目标 3. 实验中需要导入的库 二.方案设计(包括背景.原理.必要的公式.图表.算法步骤等等) 1. 实验背景 2. 实 ...

  3. SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库)

    SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库) 实验环境 预备知识 FpF_pFp​ 及椭圆曲线 素域 FpF_pFp​ FpF_pFp​ 上的椭圆曲线 FpF_pFp​ 上椭圆 ...

  4. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  5. 椭圆曲线公钥密码体制

    椭圆曲线公钥密码体制 1 背景介绍 1.1 密码体制的含义 1.2 椭圆曲线密码体制 2 算法过程 2.1 理论基础 2.2 基于离散对数上的难解问题 2.3 加解密过程 2.4 攻击 3 算法实现 ...

  6. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(十) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  7. 12、SM2椭圆曲线公钥密码算法

    参考推荐: 国家密码管理局关于发布<SM2椭圆曲线公钥密码算法>公告(国密局公告第21号)_国家密码管理局 https://blog.csdn.net/u013137970/article ...

  8. 几种主要的公钥加密算法

    RSA加密算法 一.RSA算法是什么? RSA基于数论的欧拉定理,是第一个安全.实用的公钥加密算法,已成为国际标准. 二.秘钥生成步骤 选取两个安全的大素数p.q(大于1024比特) 计算n = p ...

  9. openssl pkeyutl执行SM2椭圆曲线数字签名

    使用openssl pkeyutl子命令,执行SM2椭圆曲线数字签名,需要openssl命令版本大于1.1.1正式版,推荐运行环境为Ubuntu19.04.Fedora30或红帽RHEL8.0正式版, ...

  10. OpenSSL 1.1.1 新特性: 全面支持国密SM2/SM3/SM4加密算法

    OpenSSL项目最近6个月添加了许多新特性, 包括对中国SM2/SM3/SM4算法的支持: SM2椭圆曲线: https://github.com/openssl/openssl/pull/4793 ...

最新文章

  1. 反垃圾邮件网关市场分析
  2. cmake,gtest单元测试程序
  3. LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)
  4. laravel 队列queue
  5. Eclipse旧版本Luna SR2(版本4.4.2)下载地址
  6. Python接口测试-模块引用与映射
  7. boost::mp11::mp_map_update相关用法的测试程序
  8. JQuery插件:动态列和无间隙网格布局Mason.js
  9. Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解
  10. iOS UI-常用控件
  11. Vue3过渡动画实现
  12. c 语言 timestamp,c中的时间戳,精度为毫秒
  13. 1.3编程基础之算术表达式与顺序执行 01 A+B问题 (Python3实现)
  14. 谷歌,火狐浏览器不能禁用自动补齐的bug缺陷
  15. 找到软件供应链的薄弱链条
  16. SQL语句中AND OR运算符优先级
  17. C#中@的用法总结(转)
  18. Matlab 绘制箱线图
  19. TDD---测试驱动开发(1)
  20. 2018年度总结 - 黑子

热门文章

  1. 第九届蓝桥杯JavaA组省赛真题
  2. 漂浮式半潜风机(二)环境荷载
  3. JS判断数组是否相同
  4. 笛卡尔积生成商品SKU
  5. python 正则处理经纬度度分秒转换
  6. 四元数与欧拉角(RPY角)的相互转换
  7. 如何测试webservice接口
  8. python测试开发django-114.ModelForm中局部钩子(clean_)和全局钩子校验
  9. 尚学堂马士兵Oracle教程 笔记
  10. pxe装机原理_pxe网络安装操作系统 原理与详细过程