求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相关推荐

  1. 信息安全——ELGamal数字签名方案的实现

    ELGamal数字签名方案的实现 1. 问题描述 为简化问题,我们取p=19,g=2,私钥x=9,则公钥y=29 mod 19=18.消息m的ELGamal签名为(r,s),其中r=gk mod p, ...

  2. 密码学之ElGamal 数字签名 密钥产生 数字签名 验证 python实现

    ElGamal 数字签名 实验目的 通过实验了解数字签名的过程(签名过程和认证过程),掌握 ElGamal签名方案. 实验原理 ElGamal 数字签名的实现过程 1密钥产生:Alice 要对一个消息 ...

  3. ElGamal数字签名

    ElGamal数字签名 ElGamal数字签名方案使用私钥加密,公钥解密. ElGamal数字签名方案的基本元素是素数q和a,其中a是q的原根.用户A通过以下步骤产生公钥/私钥对: 生成随机整数x,使 ...

  4. elgamal签名算法c语言,ELGamal数字签名.doc

    ELGamal数字签名 摘要 随着网络的发展,人们之间的各种交流变得越来越来方便,但同时也对信息传递的安全提出了新的要求,数字签名随之广泛的深入到了人们的日常生活中. ELGamal作为目前应用比较广 ...

  5. ElGamal公钥密码算法及ElGamal数字签名方案实现

    ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法,其安全性是基于有限域上离散对数学问题的难解性.它至今仍是一个安全性良好的公钥密码算法.它既可用于加密又可用于数字签名的公钥密码体 ...

  6. elgamal java_eclipse实现ElGamal数字签名

    ElGamal数字签名,供大家参考,具体内容如下 一.实验目的 学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签名算法的编写,掌握ElGamal加密算法和ElGamal ...

  7. ElGamal数字签名笔记

    一.ElGamal数字签名的基本要素 1)a和q,q是素数,a是q的本原根. 2)签名方生成随机整数XA,(1<XA<q−1)X_A,(1<X_A<q-1)XA​,(1< ...

  8. elgamal签名算法c语言,elgamal数字签名方案

    Elgamal算法由T.E1Gamal在1985年发表的一篇论文中提出,是Rabin体制的一种变型.其修正形式已被美国国家标准技术研究所作为数字签名标准(DS),其核心就是著名是数字签名方法(DSA) ...

  9. 【密码学原理】数字签名(ElGamal签名,Schnorr签名,椭圆曲线签名,RSA-PSS签名)

    数字签名是公钥密码学发展过程中最重要的概念之一,产生和使用数字签名过程的一般模型如图所示 消息认证可以保护消息交换双方不受第三方的攻击,但是不能处理通信双方自身发生的攻击.例如对下图中的某种方式进行攻 ...

最新文章

  1. [JS] 题解:提取不重复的整数
  2. fritz_如何使用Fritz.ai将机器学习应用于Android
  3. JAVA调用SQL存储过程详解
  4. 一张图说明Linux启动过程
  5. CM: word template merge 工具
  6. 苹果关掉200m限制_苹果下载大于200M限制
  7. MINIGUI图形界面开发入门,交叉编译,移植
  8. 【转】 谈谈C++中的swap函数
  9. 亚马逊狂发智能硬件新品:全新音箱、微波炉、挂钟、家庭卫士
  10. angular2+ 中封装调用递归tree
  11. oracle常用的数据字典
  12. 2017黑客大预言:病毒传播无需文件,无人机可能成为炸弹
  13. Lucene4:创建一个简单查询
  14. oracle语句_ORACLE 常用语句实例:CTE MERGE 结合
  15. php颜色十六进制代码,如何通过PHP中的十六进制代码检索颜色的人名
  16. 清明html模板,HTML5清明节柳叶飘动特效
  17. 可见首发《模式识别与智能计算:MATLAB技术实现(第2版)》 百度网盘 下载 分享
  18. KUI-金山界面库 自定义消息
  19. 关于更换固态硬盘的一些经历...
  20. UI自动化辅助工具Inspect

热门文章

  1. java计算机毕业设计后勤招标采购管理系统2021源码+mysql数据库+系统+lw文档+部署
  2. mysql ddl ddm_数据库ddl ddm语句
  3. 全新MXone Pro自适应苹果CMSV10影视模板/亲测
  4. windows中electron用ibm_db模块调用db2数据库
  5. python读取微信群信息_利用Python转发微信群通知信息
  6. java 鸡和兔一共35只_鸡和兔一共有35只,数一数腿有94条,鸡、兔各有多少只?...
  7. mysql 表的第2条到4条记录,2020-07-30-mysql第三章作业练习
  8. python中turtle画小草_python
  9. 常用室内人员定位技术大比拼,谁技高一筹?-新导智能
  10. 用java计算某年某月的天数