FZU-1493-ElGamal数字签名-A^X=B(%C)求x
求A^x=B(%C)
x = i * m + j ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt(C) );
hash[i]====A^i%C
然后枚举i,使得AA=(A^M)^i
即初始的公式变成AA*A^j=B(%C)
若A^j为x,则就变成AA*X=B(%C),然后我们可以用扩展欧几里德来算出x。
然后对于X,去hash表里查询是否存在。
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define LL long long
#define lcm(a,b) (a*b/gcd(a,b))
//O(n)求素数,1-n的欧拉数
#define N 1500001
struct math_use
{
LL run_exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL _r=run_exgcd(b,a%b,x,y);
LL t=x;
x=y;
y=t-a/b*y;
return _r;
}
LL exgcd(LL a,LL b,LL c,LL &x,LL &y)
{
LL p=run_exgcd(a,b,x,y);
if(c%p)return -1;
x=(x*c/p)%b;
LL t=b/p;
x=(x%t+t)%t;
return p;
}
LL q_mod(LL a,LL b,LL n)
{
LL ret=1;
LL tmp=a;
while(b)
{
//基数存在
if(b&0x1) ret=ret*tmp%n;
tmp=tmp*tmp%n;
b>>=1;
}
return ret;
}
}M;
struct hash_use
{
LL x;
int ip;
friend bool operator <(const hash_use &a,const hash_use &b)
{
if(a.x!=b.x)return a.x<b.x;
else return a.ip<b.ip;
}
}hash[110000];
int select(LL x,int m)
{
int l=0;
int r=m+1;
int mid=(l+r)/2;
while(l<r)
{
if(hash[mid].x>=x)r=mid;
else l=mid+1;
mid=(l+r)/2;
}
if(hash[mid].x!=x)return -1;
return hash[mid].ip;
}
LL dos(LL a,LL b,LL c)
{
LL m=ceil(sqrt(c));
memset(hash,0,sizeof(hash));
for(int i=0;i<=m;i++)
{
hash[i].x=M.q_mod(a,i,c);
hash[i].ip=i;
}
sort(hash,hash+m+1);
LL s=M.q_mod(a,m,c);
for(int i=0;i<=m;i++)
{
LL aa=M.q_mod(s,i,c);
LL x,y;
M.exgcd(aa,c,b,x,y);
int sel=select(x,m);
if(sel!=-1)
{
return i*m+sel;
}
}
return -1;
}
int main()
{
LL p,g,y;
while(cin>>p>>g>>y)
{
LL ans=dos(g,y,p);
if(ans==-1)cout<<"ERROR"<<endl;
else cout<<ans<<endl;
}
return 0;
}
FZU-1493-ElGamal数字签名-A^X=B(%C)求x相关推荐
- 信息安全——ELGamal数字签名方案的实现
ELGamal数字签名方案的实现 1. 问题描述 为简化问题,我们取p=19,g=2,私钥x=9,则公钥y=29 mod 19=18.消息m的ELGamal签名为(r,s),其中r=gk mod p, ...
- 密码学之ElGamal 数字签名 密钥产生 数字签名 验证 python实现
ElGamal 数字签名 实验目的 通过实验了解数字签名的过程(签名过程和认证过程),掌握 ElGamal签名方案. 实验原理 ElGamal 数字签名的实现过程 1密钥产生:Alice 要对一个消息 ...
- ElGamal数字签名
ElGamal数字签名 ElGamal数字签名方案使用私钥加密,公钥解密. ElGamal数字签名方案的基本元素是素数q和a,其中a是q的原根.用户A通过以下步骤产生公钥/私钥对: 生成随机整数x,使 ...
- elgamal签名算法c语言,ELGamal数字签名.doc
ELGamal数字签名 摘要 随着网络的发展,人们之间的各种交流变得越来越来方便,但同时也对信息传递的安全提出了新的要求,数字签名随之广泛的深入到了人们的日常生活中. ELGamal作为目前应用比较广 ...
- ElGamal公钥密码算法及ElGamal数字签名方案实现
ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法,其安全性是基于有限域上离散对数学问题的难解性.它至今仍是一个安全性良好的公钥密码算法.它既可用于加密又可用于数字签名的公钥密码体 ...
- elgamal java_eclipse实现ElGamal数字签名
ElGamal数字签名,供大家参考,具体内容如下 一.实验目的 学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签名算法的编写,掌握ElGamal加密算法和ElGamal ...
- ElGamal数字签名笔记
一.ElGamal数字签名的基本要素 1)a和q,q是素数,a是q的本原根. 2)签名方生成随机整数XA,(1<XA<q−1)X_A,(1<X_A<q-1)XA,(1< ...
- elgamal签名算法c语言,elgamal数字签名方案
Elgamal算法由T.E1Gamal在1985年发表的一篇论文中提出,是Rabin体制的一种变型.其修正形式已被美国国家标准技术研究所作为数字签名标准(DS),其核心就是著名是数字签名方法(DSA) ...
- 【密码学原理】数字签名(ElGamal签名,Schnorr签名,椭圆曲线签名,RSA-PSS签名)
数字签名是公钥密码学发展过程中最重要的概念之一,产生和使用数字签名过程的一般模型如图所示 消息认证可以保护消息交换双方不受第三方的攻击,但是不能处理通信双方自身发生的攻击.例如对下图中的某种方式进行攻 ...
最新文章
- [JS] 题解:提取不重复的整数
- fritz_如何使用Fritz.ai将机器学习应用于Android
- JAVA调用SQL存储过程详解
- 一张图说明Linux启动过程
- CM: word template merge 工具
- 苹果关掉200m限制_苹果下载大于200M限制
- MINIGUI图形界面开发入门,交叉编译,移植
- 【转】 谈谈C++中的swap函数
- 亚马逊狂发智能硬件新品:全新音箱、微波炉、挂钟、家庭卫士
- angular2+ 中封装调用递归tree
- oracle常用的数据字典
- 2017黑客大预言:病毒传播无需文件,无人机可能成为炸弹
- Lucene4:创建一个简单查询
- oracle语句_ORACLE 常用语句实例:CTE MERGE 结合
- php颜色十六进制代码,如何通过PHP中的十六进制代码检索颜色的人名
- 清明html模板,HTML5清明节柳叶飘动特效
- 可见首发《模式识别与智能计算:MATLAB技术实现(第2版)》 百度网盘 下载 分享
- KUI-金山界面库 自定义消息
- 关于更换固态硬盘的一些经历...
- UI自动化辅助工具Inspect
热门文章
- java计算机毕业设计后勤招标采购管理系统2021源码+mysql数据库+系统+lw文档+部署
- mysql ddl ddm_数据库ddl ddm语句
- 全新MXone Pro自适应苹果CMSV10影视模板/亲测
- windows中electron用ibm_db模块调用db2数据库
- python读取微信群信息_利用Python转发微信群通知信息
- java 鸡和兔一共35只_鸡和兔一共有35只,数一数腿有94条,鸡、兔各有多少只?...
- mysql 表的第2条到4条记录,2020-07-30-mysql第三章作业练习
- python中turtle画小草_python
- 常用室内人员定位技术大比拼,谁技高一筹?-新导智能
- 用java计算某年某月的天数