破解 D-H 协议
756: 破解 D-H 协议
时间限制: 1 Sec 内存限制: 128 MB
提交: 78 解决: 18
[提交] [状态] [讨论版] [命题人:admin]
题目描述
假定通讯双方名为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,那么破解他们的密钥就比较容易了。
输入
第二行为一个正整数n,表示Alice和Bob共进行了n次连接(即运行了n次协议)。
接下来n行,每行包含两个空格分开的正整数A和B,表示某次连接中,被窃听的A,B数值。
输出
样例输入
3 31
3
27 16
21 3
9 26
样例输出
4
21
25
提示
对于30%的数据,2≤A,B,P≤1000。
对于100%的数据,2≤A,B<P<231,2≤g<20,1≤n≤20。
来源/分类
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; struct LSnode
{
int y,p;
} w[],q[]; int tot,tlen,g;
int mod; int pow_mod(int a,LL b)
{
register int ret=;
while(b)
{
if(b&)ret=(LL)ret*a%mod;
a=(LL)a*a%mod;
b>>=;
}
return ret;
} bool cmp(LSnode n1,LSnode n2)
{
if(n1.y!=n2.y) return n1.y<n2.y;
return n1.p<n2.p;
} int fd(int p)
{
int l=,r=tlen;
while(l<=r)
{
int mid=(l+r)/;
if(q[mid].y<p) l=mid+;
else if(q[mid].y>p) r=mid-;
else return q[mid].p;
}
return -;
} int BSGS(int y,int A)
{
if(y== && A==)return ;
register int tmp=pow_mod(y,mod-),cnt=;
int m=ceil(sqrt(mod));
tot=;
w[++tot].y=A;
w[tot].p=m+;
for(register int i=; i<m; i++)
{
cnt=(LL)cnt*tmp%mod;
LL t=(LL)cnt*A%mod;
w[++tot].y=t;
w[tot].p=i;
}
sort(w+,w++tot,cmp);
tlen=;
q[]=w[];
for(int i=; i<=tot; i++)
{
if(w[i].y!=w[i-].y) q[++tlen]=w[i];
}
tmp=pow_mod(y,m),cnt=;
for(register int i=; i<m; i++)
{
int pp=fd(cnt);
if(pp!=-)
{
if(pp==m+) return i*m;
return pp+i*m;
}
cnt=(LL)cnt*tmp%mod;
}
return ;
} int main()
{
int T;
scanf("%d %d",&g,&mod);
scanf("%d",&T);
while(T--)
{
int u,v;
scanf("%d %d",&u,&v);
int sx,sy;
sy=BSGS(g,v);
sx=BSGS(g,u);
printf("%d\n",pow_mod(g,(LL)sx*sy));
}
return ;
}
破解 D-H 协议的更多相关文章
- 破解使用SMB协议的Windows用户密码:acccheck
一.工作原理 Acccheck是一款针对微软的SMB协议的探测工具(字典破解用户名和密码),本身不具有漏洞利用的能力. SMB协议:SMB(Server Message Block)通信协议主要是作为 ...
- Linux 利用hosts.deny 防止暴力破解ssh(转)
一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...
- Linux 利用hosts.deny 防止暴力破解ssh
一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...
- windows下hashcat利用GPU显卡性能破解密码
由于一般密码破解工具的破解速度实在是太慢,而且支持的密码破解协议也不多,暴力破解的话,有的密码1年时间也破不出来,用字典跑的话必须要明文密码在字典里才行,而且密码字典太大的话,也很浪费时间,跑不出来也 ...
- [IOS Delegate和协议]
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/25655443 作者:小马 代理和协议的语法这里不赘述,自己查资料. 这个demo的 ...
- iOS 委托和协议区别和联系
iOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法: 委托是一种设计模式,是一 ...
- 协议Protocol
1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. ...
- OC1_协议语句
// // Programmer.h // OC1_协议语句 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhan ...
- 路由器密码破解工具 Hydra 7.5
之前只在 Browser 中保存了路由管理密码,无奈升级时管理的密码丢失了,又不想重新设置,所以尝试破解登录密码. 使用破解工具 Hydra 7.5. # hydra -l username -x : ...
- IOS开发-OC学习-protocol(协议)
在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...
随机推荐
- Listener、Filter、Servlet的创建及初始化顺序
一.创建顺序 1.web.xml文件中的加载顺序为:listener-filter-servlet 2.如果web.xml中配置了<context-param>,初始化顺序: contex ...
- 我的省选 Day -12
Day -12 今天是三月份的最后一天,春天真的也就走过了1/3了呢. 昨晚做了个神秘而悲伤的梦.(这样子写下来会不会不太好.. 我梦见欢洛了. 那是在新校区的门口,我看见他,然后向他跑过去,他转身对 ...
- CF987A Infinity Gauntlet 模拟
You took a peek on Thanos wearing Infinity Gauntlet. In the Gauntlet there is a place for six Infini ...
- 无法访问http,会强制跳到https
1. Close Safari. 2. Delete the ~/Library/Cookies/HSTS.plist file. 3. Reopen Safari.
- P3823_[NOI2017]蚯蚓排队 哈希+脑子
之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...
- 忘记mysql数据库密码时进行修改方法
长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件夹( ...
- 03-----Bootstrap的介绍
一.Bootstrap的介绍 凡是使用过Bootstrap的开发者,都不在乎做这么两件事情:复制and粘贴.哈哈~,是的使用Bootstrap非常简单,但是在复制粘贴之前,需要先对Bootstrap的 ...
- 013 Roman to Integer 罗马数字转整数
给定一个罗马数字,将其转换成整数. 返回的结果要求在 1 到 3999 的范围内. 详见:https://leetcode.com/problems/roman-to-integer/descript ...
- Java集合——集合框架Set接口
1.Set接口 一个不包含重复元素的collecyion.更确切的讲,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包含一个null元素. 2.HashSet 类实现Set接口, ...
- Python metaclasses
metaclasses元类:就像对象是类的实例一样,类是它的元类的实例.调用元类可以创建类. metaclass使用type来创建类,type可以被继承生成新的元类. 这个和C#的反射很相似. 下面是 ...