实现椭圆曲线上离散对数问题的求解
密码学实验课的题目,分享一下自己的代码,可能不够完美,供参考~自己动手才是王道哦!
一、实验目的
- 掌握椭圆曲线上的加法定律;
- 熟练求解椭圆曲线上的离散对数问题。
二、实验原理
(1)有限域GF§上的椭圆曲线:对于固定的a和b,满足形如方程
y2≡x3+ax+b(mod p) ( a,b,x,yGF§且4a3+27b2(mod p)≠0).
(2)椭圆曲线Ep(a,b)上的加法定义如下:
设P, Q, REp(a,b),则
①P+O=O+P=P;
②若P=(x,y),那么(x, y)+(x, -y)=O,即(x, -y)是P的加法逆元,记为-P;
③P+Q=Q+P;
④(P+Q)+R=P+(Q+R);
⑤设P=(x1,y1),Q=(x2,y2),P≠-Q,则P+Q=(x3,y3)由以下确定:
x3≡λ2-x1-x2(mod p)
y3≡λ(x1-x3)-y1(mod p)
其中。
(3)椭圆曲线上的离散对数问题(ECDLP):
用E(GF§)表示定义在有限域GF§上椭圆曲线E的有理子群,设任意两点P,QE (GF§)。求使kP=Q成立的k值问题就是E上的椭圆曲线离散对数问题。
三、实验要求
编程求解椭圆曲线上的离散对数问题,主要包括椭圆曲线上的加法函数,乘法逆元的求解,以及验证点是否在椭圆曲线上等。
四、实验内容
GF(29)上曲线E:y2=x3+4x+20 (mod p);E上两点P=(13,23),Q=(3,28)。编程求解k使满足kP=Q。
五、 源代码
// 密码学08.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
using namespace std;
int qx ;
int qy ;class Point{
public:Point(int a, int b):px(a),py(b){}int getx(){ return px; }int gety(){ return py; }Point add(Point p2);
private:int px, py;
};int x, y, q;
int func(int a, int b){if (b == 0){x = 1; y = 0; q = a;}else{func(b, a%b);double t = x;x = y; y = t - a / b*y;}return y;//y是 b mod a的逆元 不保证y在一定范围内
}
Point Point:: add(Point p2){int x1 = px;int y1 = py;int x2 = p2.getx();int y2 = p2.gety();int r = 0;int x3 = x1, y3 = y1;if (x1 == x2&&y1 == y2){int ni = func(29, 2 * y1);while (ni<0){ni += 29;}r = ((3 * x1*x1 + 4)*ni)%29;}else{int x21 = x2 - x1;while (x21 < 0){ x21 = x21 + 29; }int ni = func(29, x21);while (ni<0){ni += 29;}r = ((y2 - y1)*ni)%29;}x3 = (r*r - x1 - x2);while (x3 < 0 || x3 >= 29){if (x3 < 0){ x3 = x3 + 29; }else{ x3 = x3 - 29; }}y3 = (r*(x1 - x3) - y1);while (y3< 0 || y3 >= 29){if (y3 < 0){y3 = y3 + 29; }else{ y3= y3 - 29; }}return Point(x3, y3);}
int qiuk(){Point p(13, 23);Point pp = p;for (int i = 0;; i++){if (pp.getx() == 3 && pp.gety() == 28){return (i + 1);}pp = pp.add(p);}
}
int _tmain(int argc, _TCHAR* argv[])
{cout << "曲线E:y2=x3+4x+20 (mod 29)" << endl;cout << "点P=(13,23),Q=(3,28)" << endl;cout << "满足kP=Q的k是:" << endl;cout <<qiuk()<<endl;return 0;
}
实现椭圆曲线上离散对数问题的求解相关推荐
- 椭圆曲线离散对数问题以及求解
椭圆曲线定义 设Fp 表示具有p个元素的有限域,p > 3为一个素数.椭圆曲线上的有理点集合E(Fp)定义为 判别式 = 4a3 + 27b2 != 0(平滑无奇点) 点的加法 设E(Fp)上两 ...
- 公钥密码系统主要依赖的三种数学难题:1.大整数因子分解问题 2.离散对数问题 (DLP问题) 3. 椭圆曲线上的离散对数问题(ECDLP)
公钥密码系统主要依赖下面三种数学难题 1.大整数因子分解问题,如 RSA 系统 1.数理 2.流程 2.离散对数问题 (DLP问题) 1.数理: 2.流程:(EIGamal 公钥系统) 3. 椭圆曲线 ...
- matlab有限域多项式除法_椭圆曲线密码学简介(二):有限域的椭圆曲线及离散对数问题...
本文主要翻译自这篇文章 译者注 ★ 本文承接上文所讨论的椭圆曲线,并将曲线的定义域从实数域缩小到了有限域,引出离散对数问题 " ★ 首先介绍了有限域的定义,并给出了一种基于模运算的有限域 & ...
- 椭圆曲线上的群和构造方法
实数域上的群 什么是椭圆曲线? 椭圆曲线是点的集合.一般由方程y2=x3+ax+b,4a3+27b2≠0y^2 = x^3+ax+b,4a^3+27b^2\neq0y2=x3+ax+b,4a3 ...
- NVIDIA GPU上的直接线性求解器
NVIDIA GPU上的直接线性求解器 NVIDIA cuSOLVER库提供了密集且稀疏的直接线性求解器和本征求解器的集合,它们为计算机视觉,CFD,计算化学和线性优化应用程序提供了显着的加速.cuS ...
- python 椭圆曲线加法_椭圆曲线上点的运算
https://aaron67.cc/2020/09/26/ec-point-operation/ 对定义在有限域上的椭圆曲线 E = ( p , a , b , G , n , h ) E = (p ...
- OpenSSL密码库算法笔记——第5.4.1章 椭圆曲线上点的仿射坐标表示
椭圆曲线上点的表示分成仿射坐标系表示和射影坐标表示形式,首先来看看仿射坐标表示形式. 素域Fp上的椭圆曲线E由(仿射)方程y2=x3+ax+b决定,设曲线上的两个点为P1=(x1,y1),P2=(x2 ...
- 生日攻击实现离散对数问题的求解(C++)
!!!生日攻击是个概率性问题,以下代码可能只能实现部分离散对数求解问题,通过修改随机数种子可能会解决不同的问题- // BirthdayAttack.cpp : 定义控制台应用程序的入口点. //生日 ...
- 数学学渣必备!拍照上传,分步求解,微软解题神器拯救你
整理 | Jane 出品 | AI科技大本营(ID:rgznai100) 在学好数学这条路上,很多同志前赴后继「死伤无数」,即便大家不断的寻求「场外救援」,可最终都逃不过一个字:难!两个字:真难!三个 ...
最新文章
- Linux之socket套接字编程20160704
- 神州数码与神州控股、神州信息共同主办首届技术年会,透露出什么信号?
- TIME_WAIT状态及存在原因
- Java之HashMap源码解析1
- 链表用java实现简单单链表linkedlist
- 由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)
- plsql轻量版记录类型1
- 现在是小程序最好的时代
- 极光im php,极光IM- 微信小程序 SDK - 极光文档
- 分布式 | log4j2 漏洞修复方案
- Scrapy框架爬取百度新闻
- SSD-tensorflow Windows环境下,mAP的计算
- 医学影像后处理服务器系统,医学影像后处理的应用
- Dubbo之服务导入流程解析
- Windos环境下kafka配置启动Zookeeper时,报错:Invalid config, exiting abnormally.
- Processing摸索前行(9)-音频可视化
- 查找OpenJDK安装路径
- 【程序设计】定时任务调度平台需求说明书
- Windows10自带Ubuntu更换UI主题
- 脑网络分析软件丨Hermes 使用