Elliptic Curve
素域上椭圆曲线E(Fp)E(F_p)E(Fp)的C++实现
EC.hEC.hEC.h
#pragma once#include <iostream>#include <NTL/ZZ.h> // integers
#include <NTL/ZZ_p.h> // integers mod pusing namespace std;
using namespace NTL;#pragma comment(lib, "NTL")typedef char int8;
typedef int int32;
typedef long long int64;
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;// 换行
#define pn puts("")// 异常
#define ErrorInfo(format, ...) {\printf("File:%s, Line:%d, Function:%s, ",\__FILE__, __LINE__ , __FUNCTION__);\printf(format, ##__VA_ARGS__);}/*E(F_p)上椭圆曲线点
*/
struct Point
{uint8 PC; //标识。无穷远点PC=00,点的未压缩表示PC=04ZZ x; //横坐标ZZ y; //纵坐标
};//打印
ostream& operator<<(ostream& cout, Point& P);/*Elliptic curve素域上椭圆曲线,E(F_p)y^2 = x^3 + ax + b
*/
class EC
{
private:ZZ p;ZZ a;ZZ b;public:/*椭圆曲线初始化*/void init(ZZ& p, ZZ& a, ZZ& b);/*判断是否是椭圆曲线上的点*/bool IsECPoint(Point& op1);/*加法*/void Add(Point& res, Point& op1, Point& op2);/*倍点*/void Double(Point& res, Point& op1);/*多倍点*/void Multiple(Point& res, ZZ& k, Point& op1);/*打印EC参数*/void Param();};
EC.cppEC.cppEC.cpp
#include "EC.h"ostream& operator<<(ostream& cout, Point& P)
{printf("struct Point\n\tPC = %02x\n", P.PC);if (P.PC != 0){cout << "\tx = " << P.x; pn;cout << "\ty = " << P.y; pn;}return cout;
}void EC::init(ZZ&p, ZZ& a, ZZ& b)
{if ((4 * PowerMod(a%p, 3, p) + 27 * PowerMod(b%p, 2, p)) % p == 0){ErrorInfo("%s\n", "4*a^3 + 27*b^2 = 0 mod p");return;}this->p = p;this->a = a;this->b = b;
}bool EC::IsECPoint(Point& op1)
{if (op1.PC == 0)return 1;elsereturn PowerMod(op1.y, 2, p) == (PowerMod(op1.x, 3, p) + a * op1.x + b) % p;
}void EC::Add(Point& res, Point& op1, Point& op2)
{if (op1.PC == 0 || op2.PC == 0){if (op1.PC != 0){res = op1;return;}if (op2.PC != 0){res = op2;return;}res.PC = 0;return;}if (op1.x == op2.x){if (op1.y == op2.y)Double(res, op1);else if (op1.y + op2.y == p)res.PC = 0;elseErrorInfo("%s\n", "x1 == x2, but y1 != y2 and y1 != -y2");}else{res.PC = 4;ZZ xx = op2.x + (p - op1.x);if (xx >= p)xx -= p;ZZ lambda = ((op2.y + (p - op1.y))*InvMod(xx, p)) % p;ZZ x = (PowerMod(lambda, 2, p) + (p - op1.x) + (p - op2.x)) % p;res.y = (lambda*(op1.x - x) + (p - op1.y)) % p;res.x = x;}
}void EC::Double(Point& res, Point& op1)
{if (op1.PC == 0){res.PC = 0;return;}if (op1.y == 0){ErrorInfo("%s\n", "y1 == 0");}else{res.PC = 4;ZZ yy = 2 * op1.y;if (yy >= p)yy -= p;ZZ lambda = ((3 * PowerMod(op1.x, 2, p) + a)*InvMod(yy, p)) % p;ZZ x = (PowerMod(lambda, 2, p) + 2 * (p - op1.x)) % p;res.y = (lambda*(op1.x - x) + (p - op1.y)) % p;res.x = x;}
}void EC::Multiple(Point& res, ZZ& k, Point& op1)
{if (op1.PC == 0){res.PC = 0;return;}Point op = op1;ZZ kk = k;res.PC = 0;while (kk > 0){if ((kk & 1) == 1)Add(res, res, op);Double(op, op);kk >>= 1;}
}void EC::Param()
{cout << "class EC\n";cout << "\ta=" << a; pn;cout << "\tb=" << b; pn;cout << "\tp=" << p; pn; pn;
}
Elliptic Curve相关推荐
- Elliptic Curve Cryptography (ECC) and Pairings 椭圆曲线密码学与配对
本文是Dan Boneh 和Victor Shoup所写书籍A Graduate Course in Applied Cryptography的笔记. The group of points of a ...
- Halo中的elliptic curve cycle
1. 引言 Bowe等人2019年论文<Halo: Recursive Proof Composition without a Trusted Setup>. 该论文中的部分verific ...
- 椭圆曲线加密(Elliptic Curve Cryptography, ECC)
近年来,国内外的科研人员面向设备资源受到限制的多种场景提出了很多基于ECC的认证密钥协商协议.虽然各协议应用场景不尽相同,但解决的问题和最终的目标都较为类似,可以归纳为在性能开销尽可能小的前提下,安全 ...
- Elliptic Curve Cryptography: a gentle introduction
转载自:https://www.jianshu.com/p/2e6031ac3d50?from=groupmessage 原文链接:https://andrea.corbellini.name/201 ...
- Elliptic Curve Cryptography: finite fields and discrete logarithms
转载自:https://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete ...
- linux安装Openssl步骤详解_问题:OpenSSL: error:100AE081:elliptic curve routines:EC_GROUP_new_by_curve_name:un
linux上安装Openssl步骤详解 问题: OpenSSL: error:100AE081:elliptic curve routines:EC_GROUP_new_by_curve_name:u ...
- 【转】Guide to Elliptic Curve Cryptography(ECC椭圆曲线算法1)
Guide to Elliptic Curve Cryptography (ECC椭圆曲线算法1) 2017年06月03日 10:14:08 原文 http://andrea.corbellini.n ...
- android 公钥pem编码,如何将PEM编码的Elliptic Curve公钥加载到Bouncy Castle中?
我有一个PEM编码的Elliptic Curve公钥,我正试图加载到Bouncy Castle中,到目前为止我尝试的所有内容都失败了.这是我正在尝试加载的密钥的示例: -----BEGIN PUBLI ...
- Elliptic Curve Cryptography: 轻轻的学
Elliptic Curve Cryptography: 轻轻的学 Elliptic curves Algebraic addition Scalar multiplication Multiplic ...
最新文章
- LeetCode: 103. Binary Tree Zigzag Level Order Traversal
- Windows下搭建SVN傻瓜式教程
- 【编码】对qsort函数的稳定排序优化-京东实习笔试编程题(一)-2016.04.08
- java取余时前者前者小于后者_Java基本语法
- c语言 extern_Visual C++ 6.0环境中C语言extern 变量使用过程报错
- csp初赛复习(往年真题+解析)
- CSS3 建立弹性盒布局 Flex布局
- 资源放送丨《OGG日常运维及故障处理》PPT视频
- SpringCloud学习笔记022---SpringBoot中集成使用MongoDb进行增删改查
- as3通用三方库大全
- 6-4 破碎的键盘 uva11988
- 统计难题 HDU - 1251(字典树)
- Python 爬虫 书籍爬取实例
- 计算机固态硬盘作用,固态硬盘是什么及作用
- 使用OpenCV将一个三角形图形扭曲到另一个三角形
- 关于计算机的论文英语2000字,英语论文2000字左右
- 验证码输入错误后自动刷新验证码
- 2021-2027全球与中国USB智能电源板市场现状及未来发展趋势
- CAD无法拖入打开文件的解决方法
- Truffle - 2 利用Truffle编写、测试智能合约并将其部署到不同的测试网络
热门文章
- 怎么把电脑文件传到弹性云服务器,怎么把电脑文件传到弹性云服务器
- TS+vue3 页面红色波浪线(和声明类型有关)
- 5 款可替代 du 命令的工具
- chrome和Firefox浏览器如何访问非安全端口站点
- [小说连载]张小庆,在路上(11)- 产品还是项目?
- coursera 吴恩达四卷积神经网络第四周 Art Generation with Neural Style Transfer
- # CF #808 Div.2(A - C)
- 3D游戏引擎系列十一
- 什么是脏读,不可重复读,幻觉读?
- 《具体数学》部分习题解答4