【Python】ECC加密

  • ECC加密
    .全称:椭圆曲线加密(Elliptic Curve Cryptography),ECC加密算法是一种公钥加密技术,以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的Abel群离散对数难解性,实现加密、解密和数字签名。将椭圆曲线中的加法运算与离散对数中的模乘运算相对应,就可以建立基于椭圆曲线的对应密码体制。

# -*- coding:utf-8 *-# description: ECC椭圆曲线加密算法实现"""考虑K=kG ,其中K、G为椭圆曲线Ep(a,b)上的点,n为G的阶(nG=O∞ ),k为小于n的整数。则给定k和G,根据加法法则,计算K很容易但反过来,给定K和G,求k就非常困难。因为实际使用中的ECC原则上把p取得相当大,n也相当大,要把n个解点逐一算出来列成上表是不可能的。这就是椭圆曲线加密算法的数学依据点G称为基点(base point)k(k<n)为私有密钥(privte key)K为公开密钥(public key)
"""def get_inverse(mu, p):"""获取y的负元"""for i in range(1, p):if (i*mu)%p == 1:return ireturn -1def get_gcd(zi, mu):"""获取最大公约数"""if mu:return get_gcd(mu, zi%mu)else:return zidef get_np(x1, y1, x2, y2, a, p):"""获取n*p,每次+p,直到求解阶数np=-p"""flag = 1  # 定义符号位(+/-)# 如果 p=q  k=(3x2+a)/2y1mod pif x1 == x2 and y1 == y2:zi = 3 * (x1 ** 2) + a  # 计算分子      【求导】mu = 2 * y1    # 计算分母# 若P≠Q,则k=(y2-y1)/(x2-x1) mod pelse:zi = y2 - y1mu = x2 - x1if zi* mu < 0:flag = 0        # 符号0为-(负数)zi = abs(zi)mu = abs(mu)# 将分子和分母化为最简gcd_value = get_gcd(zi, mu)     # 最大公約數zi = zi // gcd_value            # 整除mu = mu // gcd_value# 求分母的逆元  逆元: ∀a ∈G ,ョb∈G 使得 ab = ba = e# P(x,y)的负元是 (x,-y mod p)= (x,p-y) ,有P+(-P)= O∞inverse_value = get_inverse(mu, p)k = (zi * inverse_value)if flag == 0:                   # 斜率负数 flag==0k = -kk = k % p# 计算x3,y3 P+Q"""x3≡k2-x1-x2(mod p)y3≡k(x1-x3)-y1(mod p)"""x3 = (k ** 2 - x1 - x2) % py3 = (k * (x1 - x3) - y1) % preturn x3,y3def get_rank(x0, y0, a, b, p):"""获取椭圆曲线的阶"""x1 = x0             #-p的x坐标y1 = (-1*y0)%p      #-p的y坐标tempX = x0tempY = y0n = 1while True:n += 1# 求p+q的和,得到n*p,直到求出阶p_x,p_y = get_np(tempX, tempY, x0, y0, a, p)# 如果 == -p,那么阶数+1,返回if p_x == x1 and p_y == y1:return n+1tempX = p_xtempY = p_ydef get_param(x0, a, b, p):"""计算p与-p"""y0 = -1for i in range(p):# 满足取模约束条件,椭圆曲线Ep(a,b),p为质数,x,y∈[0,p-1]if i**2%p == (x0**3 + a*x0 + b)%p:y0 = ibreak# 如果y0没有,返回falseif y0 == -1:return False# 计算-y(负数取模)x1 = x0y1 = (-1*y0) % preturn x0,y0,x1,y1def get_graph(a, b, p):"""输出椭圆曲线散点图"""x_y = []# 初始化二维数组for i in range(p):x_y.append(['-' for i in range(p)])for i in range(p):val =get_param(i, a, b, p)  # 椭圆曲线上的点if(val != False):x0,y0,x1,y1 = valx_y[x0][y0] = 1x_y[x1][y1] = 1print("椭圆曲线的散列图为:")for i in range(p):              # i= 0-> p-1temp = p-1-i        # 倒序# 格式化输出1/2位数,y坐标轴if temp >= 10:print(temp, end=" ")else:print(temp, end="  ")# 输出具体坐标的值,一行for j in range(p):print(x_y[j][temp], end="  ")print("")   #换行# 输出 x 坐标轴print("  ", end="")for i in range(p):if i >=10:print(i, end=" ")else:print(i, end="  ")print('\n')def get_ng(G_x, G_y, key, a, p):"""计算nG"""temp_x = G_xtemp_y = G_ywhile key != 1:temp_x,temp_y = get_np(temp_x,temp_y, G_x, G_y, a, p)key -= 1return temp_x,temp_ydef ecc_main():while True:a = int(input("请输入椭圆曲线参数a(a>0)的值:"))b = int(input("请输入椭圆曲线参数b(b>0)的值:"))p = int(input("请输入椭圆曲线参数p(p为素数)的值:"))   #用作模运算# 条件满足判断if (4*(a**3)+27*(b**2))%p == 0:print("您输入的参数有误,请重新输入!!!\n")else:break# 输出椭圆曲线散点图get_graph(a, b, p)# 选点作为G点print("user1:在如上坐标系中选一个值为G的坐标")G_x = int(input("user1:请输入选取的x坐标值:"))G_y = int(input("user1:请输入选取的y坐标值:"))# 获取椭圆曲线的阶n = get_rank(G_x, G_y, a, b, p)# user1生成私钥,小keykey = int(input("user1:请输入私钥小key(<{}):".format(n)))# user1生成公钥,大KEYKEY_x,kEY_y = get_ng(G_x, G_y, key, a, p)# user2阶段# user2拿到user1的公钥KEY,Ep(a,b)阶n,加密需要加密的明文数据# 加密准备k = int(input("user2:请输入一个整数k(<{})用于求kG和kQ:".format(n)))k_G_x,k_G_y = get_ng(G_x, G_y, k, a, p)                         # kGk_Q_x,k_Q_y = get_ng(KEY_x, kEY_y, k, a, p)                     # kQ# 加密plain_text = input("user2:请输入需要加密的字符串:")plain_text = plain_text.strip()#plain_text = int(input("user1:请输入需要加密的密文:"))c = []print("密文为:",end="")for char in plain_text:intchar = ord(char)cipher_text = intchar*k_Q_xc.append([k_G_x, k_G_y, cipher_text])print("({},{}),{}".format(k_G_x, k_G_y, cipher_text),end="-")# user1阶段# 拿到user2加密的数据进行解密# 知道 k_G_x,k_G_y,key情况下,求解k_Q_x,k_Q_y是容易的,然后plain_text = cipher_text/k_Q_xprint("\nuser1解密得到明文:",end="")for charArr in c:decrypto_text_x,decrypto_text_y = get_ng(charArr[0], charArr[1], key, a, p)print(chr(charArr[2]//decrypto_text_x),end="")if __name__ == "__main__":print("*************ECC椭圆曲线加密*************")ecc_main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陪诊系统|陪诊小程序|陪诊服务让就医更容易

陪诊系统已经出现了好几年。尤其是这两年&#xff0c;它得到了人们的广泛认可。陪诊行业的快速发展主要是因为人们对这个行业的需求非常大。目前&#xff0c;我国面临着严重的老龄化问题&#xff0c;生活节奏也越来越快&#xff0c;有时候无法亲自陪伴在老人的身边。陪诊工作人…

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…

re:从0开始的CSS学习之路 4. 长度单位

1. 长度单位 像素px&#xff1a;一个像素就是屏幕中一个不可分割的点。我们应用的屏幕实际上是由一个个的像素点构成的。 不同显示器的像素点大小也不同&#xff0c;在屏幕尺寸相同的情况下&#xff0c;像素越小&#xff0c;显示效果越清晰。 大部分浏览器默认字体大小是16px …

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

VScode上无法运行TSC命令,Typescript

如何解决问题 第一步&#xff1a;使用 winx 快捷键&#xff0c;会出现如下弹窗&#xff0c;鼠标左键单击Windows PowerShell 即可打开shell 第二步&#xff1a;运行 set-ExecutionPolicy RemoteSigned 命令&#xff0c;在询问更改执行策略的时候选择敲Y或者A 第三步&#xff…

技术分享 | MySQL 的几种数据迁移方案

1需求背景 应用侧的同学需要对数据进行导出和导入&#xff0c;于是跑来找 DBA 咨询问题&#xff1a;MySQL 如何导入大批量的数据&#xff1f; 应用侧目前的方式&#xff1a; mysqldump 工具 select outfile 语句 图形化管理工具&#xff08;MySQL Workbench、Navicat 、DBe…

【C语言初阶-结构体】关于结构体的声明定义、结构体传参详解

目录 1. 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. 结构体成员的访问 2.1(.)操作符 2.2&#xff08;->&#xff09;操作符 3.结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构体是一些值的集合&…

uniapp vue3怎么调用uni-popup组件的this.$refs.message.open() ?

vue2代码 <!-- 提示信息弹窗 --><uni-popup ref"message" type"message"><uni-popup-message :type"msgType" :message"messageText" :duration"2000"></uni-popup-message></uni-popup>typ…

算法笔记刷题日记——3.简单入门模拟 3.2 查找元素

刷题日记 3.2 查找元素 B1041 B1004 B1028 B1032 A1011 A1006 A1036 错题记录 B1028 人口普查 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的…

你为什么不喜欢关电脑?我只是想第二天能够快速进入工作状态

程序员不喜欢关电脑的主要原因就是&#xff1a;想第二天能够快速进入工作状态。大部分不喜欢关电脑的程序员都是很敬业的程序员。 程序员的电脑上安装了很多软件&#xff0c;包括IDE、数据库客户端、Redis客户端、思维导图、画图工具、数据库设计工具等。通常在工作的时候也会…

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…

【PyQt】05-多线程

文章目录 前言一、什么是单线程、多线程二、代码现象示例多线程代码运行结果 总结 前言 文章开始还是解释一下&#xff0c;这是跟着王铭东老师学习的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是单线程、多线程 单线程 在Python中&am…

TCP和UDP相关问题(重点)(1)

1.TCP与UDP的区别&#xff1f; TCP和UDP都是传输层的协议&#xff0c;对于TCP来说在传输数据前是必须要建立连接的&#xff0c;而UDP在传输数据前不需要建立连接&#xff1b;TCP是可靠传输服务&#xff0c;有三次握手、数据的确认、重传等机制&#xff0c;而UDP是不可靠的&…

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前&#xff0c;对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后&#xff0c;引进了交叉引用流(cross-reference stream)对象&#xff0c;可以用它来存储对象的交叉引用信息&#xff0c;就像交叉引用表的功能一样。 采用交…

C遗漏知识(个人向)

之前C语言遗漏的一些。 数据在内存中的存储 原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码&#xff1a;直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码&…

力扣383-赎金信

赎金信 题目链接 解题思路 统计magazine中字符出现的字符&#xff0c;用哈希表保存遍历ransomNote&#xff0c;记录其中出现的字符&#xff0c;出现一次&#xff0c;哈希表删除对应的字符遍历哈希表&#xff0c;如果有的字符出现的次数为负数&#xff0c;则不能拼凑出目标字符…

Javascript入门学(基础)

软件篇 JS基础语法第一天 1.javascript介绍 1.1 js是什么 是什么 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果&#xff0c;而html和css是标记性语言&#xff0c;并非编程语言有什么用 js的组成 htmlcssjs实现按钮点击功能 …

Vision Transfomer系列第一节---从0到1的源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 这里写目录标题 准备逐步源码实现数据集读取VIt模型搭建hand类别和位置编码类别编码位置编码 blocksheadVIT整体 Runner(参考mmlab)可视化 总结 准备 本博客完成Vision Transfomer(VIT)模型的搭建和flowers数…

什么是大模型

目录 让你了解什么是大模型什么是大模型&#xff1f;大模型的应用场景常见的大模型技术实例分析&#xff1a;深度学习语言模型GPT-3 让你了解什么是大模型 大模型&#xff08;Big Model&#xff09;是指在机器学习和人工智能领域中处理大规模数据和复杂模型的一种方法或技术。…

股票K线简介

股票K线&#xff08;K-Line&#xff09;是用于表示股票价格走势的图形&#xff0c;主要由四个关键价格点组成&#xff1a;开盘价、收盘价、最高价和最低价。K线图广泛应用于股票市场技术分析中&#xff0c;它提供了丰富的信息&#xff0c;帮助分析师和投资者理解市场的行情走势…