我也看得云里雾里,

但是ECC和RSA并列为非对称加密双雄,

还是很有必要了解一下的。

RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高。

而且,这个ECC的加法乘法规则,和普通都不一样,

其解是属于一个什么阿贝尔群(一听就知道高级啦)。

百度的文章,下面这个比较详细。

https://www.sohu.com/a/216057858_465483

from hashlib import sha256def sha256d(string):if not isinstance(string, bytes):string = string.encode()return sha256(sha256(string).digest()).hexdigest()def inv_mod(b, p):if b < 0 or p <= b:b = b % pc , d = b, puc, vc, ud, vd, temp = 1, 0, 0, 1, 0while c != 0:temp = cq, c, d = d // c, d % c, tempuc, vc, ud, vd = ud - q * uc, vd - q * vc, uc, vcassert d == 1if ud > 0:return udelse:return ud + pdef leftmost_bit(x):assert x > 0result = 1while result <= x:result = 2 * resultreturn result // 2print(inv_mod(2, 23))
print(3*inv_mod(1, 23) % 23)def show_points(p, a, b):return [(x, y) for x in range(p) for y in range(p) if (y*y - (x*x*x + a*x + b)) % p == 0]print(show_points(p=29, a=4, b=20))def double(x, y, p, a, b):l = ((3 * x * x + a) * inv_mod(2 * y, p)) % px3 = (l * l - 2 * x) % py3 = (l * (x - x3) - y) % preturn x3, y3print(double(1, 4, p=5, a=2, b=3))def add(x1, y1, x2, y2, p, a, b):if x1 == x2 and y1 == y2:return double(x1, y1, p, a, b)l = ((y2 - y1) * inv_mod(x2 - x1, p)) % px3 = (l * l - x1 -x2) % py3 = (l * (x1 - x3) - y1) % preturn x3, y3print(add(1, 4, 3, 1, p=5, a=2, b=3))def get_bits(n):bits = []while n != 0:bits.append(n & 1)n >> 1return bitsclass CurveFp(object):def __init__(self, p, a, b):""" y^2 = x^3 + a*x + b (mod p)."""self.p = pself.a = aself.b = bdef contains_point(self, x, y):return (y * y - (x * x * x + self.a * x + self.b)) % self.p == 0def show_all_points(self):return [(x, y) for x in range(self.p) for y in range(self.p) if(y * y - (x * x * x + self.a * x + self.b)) % self.p == 0]def __repr__(self):return "Curve(p={0:d}, a={1:d}, b={2:d})".format(self.p, self.a, self.b)class Point(object):def __init__(self, curve, x, y, order=None):self.curve = curveself.x = xself.y = yself.order = order# self.curve is allowed to be None only for INFINITY:if self.curve:assert self.curve.contains_point(x, y)if order:assert self * order == INFINITYdef __eq__(self, other):"""Is this point equals to another"""if self.curve == other.curve \and self.x == other.x \and self.y == other.y:return Trueelse:return Falsedef __add__(self, other):"""Add one point to another point."""if other == INFINITY:return selfif self == INFINITY:return otherassert self.curve == other.curveif self.x == other.x:if (self.y + other.y) % self.curve.p == 0:return INFINITYelse:return self.double()p = self.curve.pl = ((other.y - self.y) * \inv_mod(other.x - self.x, p)) % px3 = (l * l - self.x - other.x) % py3 = (l * (self.x - x3) - self.y) % preturn Point(self.curve, x3, y3)def __mul__(self, other):e = otherif self.order:e = e % self.orderif e == 0:return INFINITYif self == INFINITY:return INFINITYe3 = 3 * enegative_self = Point(self.curve, self.x, -self.y, self.order)i = leftmost_bit(e3) // 2result = selfwhile i > 1:result = result.double()if (e3 & i) != 0 and (e & i) == 0:result = result + selfif (e3 & i) == 0 and (e & i) != 0:result = result + negative_selfi = i // 2return resultdef __rmul__(self, other):"""Multiply a point by an integer."""return self * otherdef __repr__(self):if self == INFINITY:return "infinity"return "({0},{1})".format(self.x, self.y)def double(self):"""the double point."""if self == INFINITY:return INFINITYp = self.curve.pa = self.curve.al = ((3 * self.x * self.x + a) * \inv_mod(2 * self.y, p)) % px3 = (l * l - 2 * self.x) % py3 = (l * (self.x - x3) - self.y) % preturn Point(self.curve, x3, y3)def invert(self):return Point(self.curve, self.x, -self.y % self.curve.p)INFINITY = Point(None, None, None)p, a, b = 29, 4, 20
curve = CurveFp(p, a, b)
p0 = Point(curve, 3, 1)
print(p0*2)
print(p0*20)

输出:

12
3
[(0, 7), (0, 22), (1, 5), (1, 24), (2, 6), (2, 23), (3, 1), (3, 28), (4, 10), (4, 19), (5, 7), (5, 22), (6, 12), (6, 17), (8, 10), (8, 19), (10, 4), (10, 25), (13, 6), (13, 23), (14, 6), (14, 23), (15, 2), (15, 27), (16, 2), (16, 27), (17, 10), (17, 19), (19, 13), (19, 16), (20, 3), (20, 26), (24, 7), (24, 22), (27, 2), (27, 27)]
(3, 1)
(2, 0)
(24,7)
(15,27)

转载于:https://www.cnblogs.com/aguncn/p/10351806.html

python实现的椭圆曲线加密相关推荐

  1. python椭圆曲线加密算法_椭圆曲线加密中的加法乘法浅析

    本文不深入椭圆曲线加密算法的全部知识,只针对椭圆曲线加密中需要用到的加法和乘法计算规则进行浅析. 实际练习中碰到一个比较简单密码学的问题,但是涉及到了椭圆曲线加密算法,题目描述如下: 已知椭圆曲线加密 ...

  2. 椭圆曲线加密——椭圆曲线的动态展示python代码分享

    学校信息安全课老师让我来讲一下椭圆曲线加密,当看到椭圆曲线公式的时候,就想研究一下改变a或者b会对椭圆曲线的形状带来哪些影响,于是自己搜集一些资料绘制出了随a, b变化的椭圆曲线.a,b使用进度条来改 ...

  3. python椭圆曲线加密算法_ECC椭圆曲线加密学习笔记

    0x00 前言 之前做题的时候遇到一个ECC相关的题目,学习了好几篇大佬的文章ECC的剖析文章,学习之后也记录一下,写一遍加强自己的巩固. 此文章严格意义上来讲应该算是读书笔记,在总结过程中观摩了很多 ...

  4. python 椭圆曲线加密_椭圆曲线加解密算法Python3完整实现

    信息安全课程的实验,根据课件及网上资料,参考实现 代码中注释比较完善,算法的实现整体流程如下: - 实现基本流程:考虑K=kG ,其中K.G为椭圆曲线Ep(a,b)上的点,n为G的阶(nG=O∞ ), ...

  5. python判断网页密码加密方式_python实现网页登录时的rsa加密流程

    对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录, ...

  6. 可以考的python方面的证书-python有证书的加密解密实现方法

    本文实例讲述了python有证书的加密解密实现方法.分享给大家供大家参考.具体实现方法如下: 最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,刚好也有时 ...

  7. 实用脚本!利用 Python 对 PDF 进行加密、解密操作,代码拿走就用!

    来源/早起Python 本文将分享如何利用 Python 对 PDF 进行加密和解密操作,主要利用到之前多次介绍过的PyPDF2 模块. PDF 加密 在之前的文章PDF合并.拆分.水印.加密中简单提 ...

  8. blob的真实地址怎么获得_使用Python抓取m3u8加密视频 续:获得index.m3u8 地址

    之前写<使用Python抓取m3u8加密视频>笔记的原因,是自己有几个视频想保存,但对于m3u8, .ts 文件拼接不熟悉,就尝试写个脚本练手. 今天看了回复,有同学想知道如何从视频网站上 ...

  9. aes加密算法python语言实现_python-AES加密解密

    转载https://www.jianshu.com/p/5d27888e7c93#!/xh #!/usr/bin/env python # -*- coding=utf-8 -*- "&qu ...

  10. 【以太坊源码阅读】椭圆曲线加密和EIP155

    1.以太坊椭圆曲线加密r,s,v https://crypto.stackexchange.com/questions/59506/ecdsa-recover-on-arbitrary-values ...

最新文章

  1. 盘点开发中那些常用的MySQL优化
  2. cxf 整合 spring 时 java.lang.VerifyError异常
  3. 我的公众号 - Old Artist
  4. entity、model和domain三者区别
  5. java hashtable 数据结构_数据结构--哈希表(Java)
  6. 什么是你的职涯“本钱”
  7. springboot 做表白墙_华农表白墙144期 | 等什么时候,她从我开的花店前经过,我把整个花店送个她可好。...
  8. 手机和Linux蓝牙通信,[原创]linux下手机与蓝牙的连接配置
  9. ASP.NET应用程序客户端执行的优化小技巧
  10. linux 终端与shell输出大小不匹配
  11. Vbs压缩备份文件夹以日期命名
  12. 用Web Developer工具栏发现SEO问题的方法
  13. Solr 4.10.3 后台管理页面介绍
  14. UIWebView 无缝切换到 WKWebView
  15. Android动态更改通知图标,修改通知标志  |  Android 开发者  |  Android Developers
  16. 【JAVA】顺序表与ArrayList
  17. linux之根文件系统
  18. 计算机与宽带路由器的连接过程,路由器怎么插线和宽带图解 路由器设置步骤图解...
  19. jquery遍历对象,数组,集合
  20. 网页短链接的实现原理

热门文章

  1. js中立即执行函数会预编译吗_浅析Vue的生命周期以及JS异步
  2. import sys是什么意思_学了半天,import 到底在干啥?
  3. 计算机 会议录用率 统计
  4. zipfian 参数是什么 Zipfian distribution 齐夫定律
  5. 区块链 如何提高TPS 为什么区块大小和出块速度越大越好
  6. 好奇怪呀后面加什么标点_好奇怪,为什么开发商就不能把这款好户型打造得更完美些呢?...
  7. c语言测试1到3章,c语言谭浩强第1章至第3章测试试题
  8. php无法写入json,php json解析不出来怎么办
  9. 计算机秘密程序 听课反思,《编制计算机程序解决问题》的教学反思
  10. linux的vmstat命令,Linux中vmstat命令起什么作用呢?