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

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. springboot 整合webservice 相关说明

    1.环境依赖 jdk8, springboot 2.3.12.release,cxf版本需要根据springboot版本修改,方法:查看springboot版本的发布日期,然后根据日期找相近的两个版本 ...

  2. Stable Diffusion中的常用术语解析

    Stable Diffusion中的常用术语解析 对于很多初学者来说,会对Stable Diffusion中的很多术语感到困惑,当然你不是唯一的那个. 在这篇文章中,我将会讲解几乎所有你在Stable ...

  3. 力扣436(java&python)-寻找右区间(中等)

    题目: 给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 . 区间 i 的 右侧区间 可以记作区间 j ,并满 ...

  4. 云服务器ECS共享标准型S6全新发布,行业内最具性价比

    近日,阿里云弹性计算发布全新一代云服务ECS共享标准型S6,性能相对上一代实例提升15%以上,价格相对上一代最高降低42%,是目前国内云计算厂商更能够提供的最具性价比的云服务器产品.一些中小型网站.轻 ...

  5. “让专业的人做专业的事”,畅捷通与阿里云的云原生故事 | 云原生 Talk

    简介: 如何借助阿里云强大的 IaaS 和 PaaS 能力去构建新一代的 SaaS 企业应用,从而给客户提供更好.更强的服务,这是畅捷通一直在思考和实践的方向.最终,畅捷通选定阿里云企业级分布式应用服 ...

  6. DTCC 2020 | 阿里云程实:云原生时代的数据库管理

    简介: 随着云原生技术的不断发展,数据库也逐渐进入了云原生时代.在云原生时代,如何高效.安全且稳定地管理云上与云下的数据库成为摆在企业面前的一大难题.在第十一届中国数据库技术大会(DTCC2020)上 ...

  7. 从KPI到OKR,高阶产品人如何推动业务高速增长

    简介: 不管是核心大目标,还是O(Objectives),或者北极星指标,奇妙等式等等,最后都需要核心组织协同方式来推动整个目标聚焦以及过程的落地. 作为产品经理人,相信很多人都遇到过以下的灵魂拷问: ...

  8. [Ethereum] Gas Station Network (GSN) eip-1613 与 Gas Relay Network (GRN) eip-1077

    在 Ethereum dapp 中,任何涉及状态改动的交易都需要消耗 Gas,这限制了很多没有钱包或者 ETH 的用户对 dapp 的采用. 理念 让非以太用户能够访问智能合约 (如dapps),允许 ...

  9. dotnet 警惕 C# 的 is var 写法

    本文将和大家介绍 C# 语言设计里面,我认为比较坑的一个语法.通过 is var 的写法,会让开发者误以为 null 是不被包含的,然而事实是在这里的 var 是被赋予含义的,将被允许 null 通过 ...

  10. Photoshop批量替换图层的方法

    平时做图片,应该有遇到这样的场景,比如P奖状.P邀请函,内容是一样的,但是图片上的名字是不一样的,要是要P100张的话,一个个手动复制改名字肯定会吐血(╯°□°)╯︵ ┻━┻ Photoshop里有个 ...