756: 破解 D-H 协议

时间限制: 1 Sec  内存限制: 128 MB
提交: 78  解决: 18
[提交] [状态] [讨论版] [命题人:admin]

题目描述

Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法。它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信道(可能被窃听)建立一个安全的密钥K,用于加密之后的通讯内容。
假定通讯双方名为Alice和Bob,协议的工作过程描述如下(其中mod表示取模运算):
协议规定一个固定的质数P,以及模P的一个原根g。P和g的数值都是公开的,无需保密。
Alice生成一个随机数a,并计算A=ga mod P,将A通过不安全信道发送给Bob。
Bob生成一个随机数b,并计算B=gb mod P,将B通过不安全信道发送给Alice。
Bob根据收到的A计算出K=Ab mod P ,而Alice根据收到的B计算出K=Ba mod P。
双方得到了相同的K,即gab mod P。K可以用于之后通讯的加密密钥。
可见,这个过程中可能被窃听的只有A,B,而a,b,K是保密的。并且根据A,B,P,g这4个数,不能轻易计算出K,因此K可以作为一个安全的密钥。
当然安全是相对的,该协议的安全性取决于数值的大小,通常a,b,P都选取数百位以上的大整数以避免被破解。然而如果Alice和Bob编程时偷懒,为了避免实现大数运算,选择的数值都小于231,那么破解他们的密钥就比较容易了。

输入

第一行包含两个空格分开的正整数g和P。
第二行为一个正整数n,表示Alice和Bob共进行了n次连接(即运行了n次协议)。
接下来n行,每行包含两个空格分开的正整数A和B,表示某次连接中,被窃听的A,B数值。

输出

输出包含n行,每行一个正整数K,为每次连接你破解得到的密钥。

样例输入

  1. 3 31
  2. 3
  3. 27 16
  4. 21 3
  5. 9 26

样例输出

  1. 4
  2. 21
  3. 25

提示

对于30%的数据,2≤A,B,P≤1000。
对于100%的数据,2≤A,B<P<231,2≤g<20,1≤n≤20。

来源/分类

思路:
北上广深算法,分别解出a、b,然后用快速幂!
AC代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4.  
  5. struct LSnode
  6. {
  7. int y,p;
  8. } w[],q[];
  9.  
  10. int tot,tlen,g;
  11. int mod;
  12.  
  13. int pow_mod(int a,LL b)
  14. {
  15. register int ret=;
  16. while(b)
  17. {
  18. if(b&)ret=(LL)ret*a%mod;
  19. a=(LL)a*a%mod;
  20. b>>=;
  21. }
  22. return ret;
  23. }
  24.  
  25. bool cmp(LSnode n1,LSnode n2)
  26. {
  27. if(n1.y!=n2.y) return n1.y<n2.y;
  28. return n1.p<n2.p;
  29. }
  30.  
  31. int fd(int p)
  32. {
  33. int l=,r=tlen;
  34. while(l<=r)
  35. {
  36. int mid=(l+r)/;
  37. if(q[mid].y<p) l=mid+;
  38. else if(q[mid].y>p) r=mid-;
  39. else return q[mid].p;
  40. }
  41. return -;
  42. }
  43.  
  44. int BSGS(int y,int A)
  45. {
  46. if(y== && A==)return ;
  47. register int tmp=pow_mod(y,mod-),cnt=;
  48. int m=ceil(sqrt(mod));
  49. tot=;
  50. w[++tot].y=A;
  51. w[tot].p=m+;
  52. for(register int i=; i<m; i++)
  53. {
  54. cnt=(LL)cnt*tmp%mod;
  55. LL t=(LL)cnt*A%mod;
  56. w[++tot].y=t;
  57. w[tot].p=i;
  58. }
  59. sort(w+,w++tot,cmp);
  60. tlen=;
  61. q[]=w[];
  62. for(int i=; i<=tot; i++)
  63. {
  64. if(w[i].y!=w[i-].y) q[++tlen]=w[i];
  65. }
  66. tmp=pow_mod(y,m),cnt=;
  67. for(register int i=; i<m; i++)
  68. {
  69. int pp=fd(cnt);
  70. if(pp!=-)
  71. {
  72. if(pp==m+) return i*m;
  73. return pp+i*m;
  74. }
  75. cnt=(LL)cnt*tmp%mod;
  76. }
  77. return ;
  78. }
  79.  
  80. int main()
  81. {
  82. int T;
  83. scanf("%d %d",&g,&mod);
  84. scanf("%d",&T);
  85. while(T--)
  86. {
  87. int u,v;
  88. scanf("%d %d",&u,&v);
  89. int sx,sy;
  90. sy=BSGS(g,v);
  91. sx=BSGS(g,u);
  92. printf("%d\n",pow_mod(g,(LL)sx*sy));
  93. }
  94. return ;
  95. }

破解 D-H 协议的更多相关文章

  1. 破解使用SMB协议的Windows用户密码:acccheck

    一.工作原理 Acccheck是一款针对微软的SMB协议的探测工具(字典破解用户名和密码),本身不具有漏洞利用的能力. SMB协议:SMB(Server Message Block)通信协议主要是作为 ...

  2. Linux 利用hosts.deny 防止暴力破解ssh(转)

    一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...

  3. Linux 利用hosts.deny 防止暴力破解ssh

    一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...

  4. windows下hashcat利用GPU显卡性能破解密码

    由于一般密码破解工具的破解速度实在是太慢,而且支持的密码破解协议也不多,暴力破解的话,有的密码1年时间也破不出来,用字典跑的话必须要明文密码在字典里才行,而且密码字典太大的话,也很浪费时间,跑不出来也 ...

  5. [IOS Delegate和协议]

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/25655443 作者:小马 代理和协议的语法这里不赘述,自己查资料. 这个demo的 ...

  6. iOS 委托和协议区别和联系

    iOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法: 委托是一种设计模式,是一 ...

  7. 协议Protocol

    1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口.           遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议.       ...

  8. OC1_协议语句

    // // Programmer.h // OC1_协议语句 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhan ...

  9. 路由器密码破解工具 Hydra 7.5

    之前只在 Browser 中保存了路由管理密码,无奈升级时管理的密码丢失了,又不想重新设置,所以尝试破解登录密码. 使用破解工具 Hydra 7.5. # hydra -l username -x : ...

  10. IOS开发-OC学习-protocol(协议)

    在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...

随机推荐

  1. git 修改远程仓库源

    自己已经写好了一个项目,想上传到 github github 创建新项目 新建 README.md , LICENSE 本地项目添加 github 远程仓库源 不是git项目 git remote a ...

  2. XML之DTD

    前言 上篇我们知道了,XML的应用范围还是很广的,那么无规矩不成方圆,如果我们每个人写XML的风格不一致,那么读起来是不是很费劲呢?所以格式良好的XML就渐渐的被我们所需要. 内容 格式良好指:拥有正 ...

  3. Mol Cell Proteomics. |马臻| psims-一个用于编写HUPO-PSI标准下的mzML和mzIdentML的python库

    大家好,本周分享的是发表在MCP(MOLECULAR&CRLLULAR PROTEOMICS)上的一篇关于质谱数据处理和识别的文章,题目是psims - A Declarative Write ...

  4. AOP分析

    cglib动态代理 Waiter target = new NaiveWaiter();//一个实现了Waiter接口的类 BeforeAdvice advice = new GreetingBefo ...

  5. 41.QT-多线程与界面之间交互总结

    1. 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件. 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread) 所以, QTh ...

  6. react native 安卓生产包无法获取线上数据

    android:usesCleartextTraffic="true"

  7. 洛谷 P2661 信息传递(并查集 & 最小环)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...

  8. Mediator模式(仲裁者设计模式)

    Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...

  9. 一些有关PyCharm使用总结

    目前在这里,你能看见 license server Python版本配置 添加另外版本的Python 设置字体大小 关于编码 关于模版 安装好之后,第一个问题就是 license server 问题, ...

  10. Django---登录(含随机生成图片验证码)、注册示例讲解

    登录(验证码).注册功能具体代码 # urls.py from django.contrib import admin from django.urls import path from app01 ...