想起来很久没写博客了,刚好今天要写实验报告,随便把之前的也完成吧

1.椭圆曲线概念

椭圆曲线在经过化解后,可以用这条式子表达:E:y²=x³+ax+b

其背后的密码学原理,是基于椭圆曲线离散对数问题,比RSA算法更有安全且运算速度更快。

在看上面的式子,我们知道构造一个椭圆曲线,需要a,b两个参数

而在有限域GF(p)上的椭圆曲线,则还需要一个参数p,它的表达式为E:y²≡x³+ax+b(mod p)

椭圆曲线的运算是符合Abel群的



1.0+0=0(0是加法单位元)

2.对所有点P=(x,y)∈E(a,b),有P+0=0+P=P

3.对所有点P=(x,y)∈E(a,b),有P+(-P)=0,点P的逆为(x,-y)

4.两点加法(重要),令P(x1,y1)∈E(a,b),Q(x2,y2)∈E(a,b)

则P+Q=R=(x3,y3)∈E(a,b)

x3=(lada)³-x1-x2

y3=lada(x1-x3)-y1

其中lada分为两种情况

一是P不等于Q,lada=(y2-y1)/(x2-x1)

二是P等于Q(倍点规则),lada=(3(x1)²+a)/2y1

5.对所有点P和Q∈E(a,b),满足加法交换侓,P+Q=Q+P

6.对所有点P和Q∈E(a,b),满足加法结合率,P+(Q+R)=(P+Q)+R

7.乘法,KP相当于K个P相加

2.椭圆曲线加解密

了解完椭圆曲线这些概念就可以进行加解密了



1.user2输入需要加密的明文

2.user2待传输的明文以某种编码方式编码到椭圆曲线上一点M

3.user2秘密选择k进行加密,计算点C1=kP;C2=M+kQ,传给user1

4.user1选定一条椭圆曲线=(a,b,p),公开参数a,b,p,

5.user1选择素阶点P

6.user1选择一个私有密钥d,并生成公开密钥Q=dP

7.user1将得到的密文用d进行解密,M=C2-dC1

原理C2-C1=M+kQ-d(kP)=M+K(dP)-d(kP)=M

再对点M进行解码就可以得到明文。

python

代码(附带注销):

import math
import random def extend_gcd(a, b):
if b == 0:
return a, 1, 0
else:
g, y, x = extend_gcd(b, a % b)
return g, x, y - (a // b) * x def niyuan(a, b): # 计算a模b的逆元
g, x, y = extend_gcd(a, b)
if g != 1:
print("a和b不互素,因此不存在逆元")
return None
else:
return x % b def tuoyuan_jia(P_x, P_y, Q_x, Q_y, a, b, p): # 椭圆曲线中的加法
if P_x == Q_x and P_y == Q_y:
lada = ((3 * (P_x ** 2) + a) * niyuan(2 * P_y, p)) % p
x3 = (lada ** 2 - P_x - Q_x) % p
y3 = (lada * (P_x - x3) - P_y) % p
return x3, y3
elif P_x != Q_x:
lada = ((Q_y - P_y) * niyuan(Q_x - P_x, p)) % p
x3 = (lada ** 2 - P_x - Q_x) % p
y3 = (lada * (P_x - x3) - P_y) % p
return x3, y3
elif P_x == Q_x and P_y != Q_y:
return 0, 0 def tuoyuan_cheng(P_x, P_y, k, a, b, p): # 椭圆曲线中的乘法,这里的k为乘于几,乘几那么就相当于几个点相加
k = int(k) # 确保k是整数类型
new_x, new_y = P_x, P_y
for i in range(k - 1):
new_x, new_y = tuoyuan_jia(new_x, new_y, P_x, P_y, a, b, p)
return new_x, new_y def message_to_point(P_x, P_y, message, a, b, p):
points = []
n = 1
for char in message:
k = ord(char) + 1
print(k)
x, y = tuoyuan_cheng(P_x, P_y, k, a, b, p)
points.append((x, y))
print("{}=>({},{})".format(n, x, y))
n += 1
return points def points_to_message(P_x, P_y,points,a, b, p):
message = ""
for point in points:
x = point[0]
y = point[1]
fuP_x=P_x
fuP_y=-P_y
n=0
while x!=P_x and y!=P_y:
x , y=tuoyuan_jia(x, y, fuP_x, fuP_y, a, b, p)
n+=1
char=chr(n)
message+=char
print("解密后的字符串"+message)
return message def cal_jie(P_x, P_y, a, b, p):
fuP_x = P_x
fuP_y = -P_y % p
new_x, new_y = P_x, P_y
n = 1 # 初始化n
while True:
n += 1
new_x, new_y = tuoyuan_jia(new_x, new_y, P_x, P_y, a, b, p)
if new_x == fuP_x and new_y == fuP_y:
return n + 1 def encode(P_x, P_y, Q_x, Q_y, k, points, a, b, p):
poointsC1 = []
poointsC2 = []
kP_x, kP_y = tuoyuan_cheng(P_x, P_y, k, a, b, p)
poointsC1.append((kP_x, kP_y))
print("计算得密文为")
print("c1")
print(poointsC1)
kQ_x, kQ_y = tuoyuan_cheng(Q_x, Q_y, k, a, b, p)
for point in points:
x = point[0]
y = point[1]
x = int(x)
y = int(y)
newkQ_x, newkQ_y = tuoyuan_jia(kQ_x, kQ_y, x, y, a, b, p)
poointsC2.append((newkQ_x, newkQ_y))
print("c2")
print(poointsC2)
return poointsC1, poointsC2 def decode(poointsC1, poointsC2, d, a, b, p):
points = []
C1 = poointsC1[0]
C1_x = C1[0]
C1_y = C1[1]
inv_dC1_x, inv_dC1_y = tuoyuan_cheng(C1_x, C1_y,d,a, b, p)
inv_dC1_y=-inv_dC1_y
for point in poointsC2:
C2_x = point[0]
C2_y = point[1]
#M_x=(C2_x-inv_dC1_x)%p
#M_y=(C2_y-inv_dC1_y)%p
M_x, M_y = tuoyuan_jia(C2_x, C2_y, inv_dC1_x, inv_dC1_y, a, b, p)
points.append((M_x, M_y))
print(points)
return points def main():
print("****ECC椭圆曲线加解密****")
while True:
a = int(input("请输入椭圆曲线参数a(a>0)的值:"))
b = int(input("请输入椭圆曲线参数b(b>0)的值:"))
p = int(input("请输入椭圆曲线参数p(a>0)的值:")) if 4 * (a ** 3) - 27 * (b ** 2) % p == 0:
print("输入的参数有误,请重新输入")
else:
break print("user1:在如上坐标系中选一个素阶点P")
P_x = int(input("请输入选取的x坐标值:"))
P_y = int(input("请输入选取的y坐标值:")) n = cal_jie(P_x, P_y, a, b, p)
d = int(input(("user1:请输入用于生成公钥的私钥d(<{}):".format(n))))
Q_x, Q_y = tuoyuan_cheng(P_x, P_y, d, a, b, p)
print(" 计算Q=d*P得公钥Q为(" + str(Q_x) + "," + str(Q_y) + ")") mingwen = input("user2:请输入需要加密的字符串:")
mingwen = mingwen.strip() # 通过strip()方法可以去除字符串两端的空格
print("明文映射的点为:")
points1 = message_to_point(P_x, P_y, mingwen, a, b, p) k = input("user2:请输入秘密选择的k(<{}):".format(n)) # 这一步我们不用,我们选择用随机数
# k = random.randint(1, n) # 生成1到阶n之间的随机整数,用于计算kP,kQ
print("user2:计算得密文为")
poointsC1, poointsC2 = encode(P_x, P_y, Q_x, Q_y, k, points1, a, b, p) print("user1解密得到明文映射的点为:")
points2=decode(poointsC1, poointsC2, d, a, b, p)
points_to_message(P_x, P_y,points2,a, b, p) if __name__ == "__main__": # 函数入口
main()

椭圆曲线密码学(ECC)加解密,附带python代码的更多相关文章

  1. CTF密码学常见加解密总结

    CTF密码学常见加解密总结 2018年03月10日 19:35:06 adversity` 本文链接:https://blog.csdn.net/qq_40836553/article/details ...

  2. 椭圆曲线密码学ECC

      椭圆曲线密码学(Elliptic curve cryptography),简称ECC,是一种建立公开密钥加密的算法,也就是非对称加密.类似的还有RSA,ElGamal算法等.ECC被公认为在给定密 ...

  3. AES和RSA加解密的Python用法

    AES AES 是一种对称加密算法,用key对一段text加密,则用同一个key对密文解密, from Crypto import Random from Crypto.Hash import SHA ...

  4. TP-Link 路由器配置 config.bin 解密工具 python 代码 (转载)

    转自吾爱破解 https://www.52pojie.cn/forum.php?mod=viewthread&tid=574222 需要安装crypto #!/usr/bin/env pyth ...

  5. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

  6. des结合base64加解密的python源码

    #coding=utf8 from pyDes import * import base64 class Crypt_Error(): pass """ des方法,de ...

  7. 对字符串进行base64加解密---基于python

    本文介绍Python 2.7中的base64模块,该模块提供了基于rfc3548的Base16, 32, 64编解码的接口.官方文档,参考这里. 当前接口基于rfc3548的Base16/32/64编 ...

  8. 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...

  9. CTF中编码与加解密总结

    CTF中那些脑洞大开的编码和加密 转自:https://www.cnblogs.com/mq0036/p/6544055.html 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到 ...

  10. Java拓展教程:文件DES加解密

    Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...

随机推荐

  1. sql 语句系列(更新系列)[八百章之第六章]

    使用另一个表更新记录 有时候我们的数据不会立即去更新,而是存在另外一张表中等待更新,这是在日常开发中常见的操作. update e set e.SAL=ns.SAL+e.SAL, e.COMM=ns. ...

  2. 重新整理 mysql 基础篇—————表锁和全局锁[六]

    前言 锁从大的方面可以分为: 1.全局锁 2.表锁 3.行锁 正文 全局锁 全局锁就是对整个数据加上读锁. 在mysql 中,加入全局锁的命令就是: Flush tables with read lo ...

  3. jenkins 持续集成和交付——一个构件小栗子前置(三)

    前言 下面介绍构建一个小栗子. 在此之前有个小前提,就是已经安装好了git 服务器,用的是gogs,详细请看外篇. 正文 插件安装 首先你要安装一个git插件. 装完git插件后,我们还得安装一些gi ...

  4. 如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

    如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事.但是在某些场景下 SSR 还是有意想不到效果. ...

  5. iLogtail社区版使用入门 - 采集MySQL Binlog

    简介: MySQL Binlog记录了MySQL的变更日志,业界也有一些方案来同步Binlog的数据,如Canal.MaxWell.DTS等.不同的工具可以实现不同的目标,iLogtail也提供了便捷 ...

  6. EventBridge 在 SaaS 企业集成领域的探索与实践

    简介: 当下降本增效是各行各业的主题,而 SaaS 应用作为更快触达和服务业务场景的方式则被更多企业熟知和采用.本文将结合实际业务场景讲述在 SaaS 行业的洞察与 SaaS 集成的探索实践. 作者: ...

  7. [ERROR] listen tcp :80: bind: permission denied

    出现这类提示的时候,表明当前用户没有权限进行 bind 操作. 在某些 Linux 云服务器提供商的运行环境中会出现. 解决方式:使用 sudo 切换为 root,然后在执行原操作. Refer:li ...

  8. OLAP系列之分析型数据库clickhouse备份方式(五)

    一.常见备份方式 1.1 备份方式 备份方式 特点 物理文件备份 对物理文件进行拷贝,备份期间禁止数据写入 dump数据导入导出 备份方式灵活,但备份速度慢 快照表备份 制作_bak表进行备份 FRE ...

  9. ES Monitoring 整理笔记

    Monitoring是elastic stack的监控模块,监控信息存在es索引中,并且可以通过kibana进行可视化的展示.(收集监控数据的方式从6.5版本起由Collectors-Exporter ...

  10. Redis官方开源的可视化管理工具 - RedisInsight

    前言 今天大姚给大家推荐一款Redis官方开源的可视化管理工具:RedisInsight. Redis介绍 Redis (Remote Dictionary Server) 是一个使用 C 语言编写的 ...