bzoj4522【CQOI2016】秘钥破解

4522: [Cqoi2016]密钥破解

Time Limit: 10 Sec  Memory Limit: 512 MB

Submit: 388  Solved: 193

[Submit][Status][Discuss]

Description

一种非对称加密算法的密钥生成过程如下:

1.任选两个不同的质数p,q

2.计算N=pq,r=(p?1)(q?1)

3.选取小于r,且与r互质的整数e

4.计算整数d,使得ed≡1KQ/r

5.二元组(N,e)称为公钥,二元组(N,d)称为私钥

当需要加密消息M时(假设M是一个小于L整数,因为任何格式的消息都可转为整数表示),

使用公钥(N,e),按照n^e≡cKQ/N运算,可得到密文C。

对密文C解密时,用私钥(N,d),按照c^d≡nKQ/N运算,可得到原文M。算法正确性证明省略。

由于用公钥加密的密文仅能用对应的私钥解密,而不能用公钥解密,因此称为非对称加密算法。

通常情况下,公钥由消息的接收方公开,而私钥由消息的接收方自己持有。这样任何发送消息的

人都可以用公钥对消息加密,而只有消息的接收方自己能够解密消息。

现在,你的任务是寻找一种可行的方法来破解这种加密算法,即根据公钥破解出私钥,并据此解密密文。

Input

输入文件内容只有一行,为空格分隔的j个正整数e,N,c。N<=2^62,c<N

Output

输出文件内容只有一行,为空格分隔的k个整数d,n。

Sample Input

3 187 45

Sample Output

107 12

//样例中 p = 11, q = 17

数论模板的应用

Pollard-Rho算法求质因数+扩展欧几里得+快速幂+快速乘

分享一个Pollard-Rho算法的讲解:http://www.cnblogs.com/jackiesteed/articles/2019910.html

(不管你们看懂没,反正我是没看懂)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
using namespace std;
ll a,c,d,e,n,p,q,r,ans;
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll getmul(ll x,ll y,ll mod)
{
	ll ret=0;
	for(;y;y>>=1,x=x*2%mod) if (y&1) ret=(ret+x)%mod;
	return ret;
}
ll getpow(ll x,ll y,ll mod)
{
	ll ret=1;
	for(;y;y>>=1,x=getmul(x,x,mod)) if (y&1) ret=getmul(ret,x,mod);
	return ret;
}
ll gcd(ll x,ll y)
{
	return y?gcd(y,x%y):x;
}
void exgcd(ll x,ll y,ll &a,ll &b)
{
	if (!y){a=1;b=0;return;}
	exgcd(y,x%y,b,a);
	b-=x/y*a;
}
ll getinv(ll x,ll y)
{
	ll ret,t;
	exgcd(x,y,ret,t);
	ret=(ret%y+y)%y;
	return ret;
}
ll f(ll x)
{
	return (getmul(x,x,n)+a)%n;
}
ll pollard_rho(ll n)
{
	ll x1,x2,tmp;
	while (1)
	{
		a=rand()%100;
		x1=x2=2;
		do
		{
			x1=f(x1);x2=f(f(x2));
			tmp=gcd(abs(x2-x1),n);
			if (tmp>1) return tmp;
		}while (x1!=x2);
	}
}
int main()
{
	srand(909475573);
	e=read();n=read();c=read();
	p=pollard_rho(n);q=n/p;
	r=(p-1)*(q-1);
	d=getinv(e,r);
	ans=getpow(c,d,n);
	printf("%lld %lld\n",d,ans);
}
时间: 2025-01-06 14:07:34

bzoj4522【CQOI2016】秘钥破解的相关文章

Visual Studio 2015官方下载 秘钥破解

微软刚刚为开发人员奉上了最新大礼Visual Studio 2015正式版.如果你是MSDN订阅用户,现在就可以去下载丰富的相关资源.如果你指向体验一把尝尝鲜,微软也是很慷慨的. Visual Studio官网已经开放了新版的全面下载,包括英文.简体中文.日文等十种语言和十四种语言包(但是没繁体中文),包括软件的各个版本,包括在线安装包和ISO独立安装镜像. 以下是部分ISO镜像下载地址: 社区版(个人免费): http://download.microsoft.com/download/B/4

Tuxera ntfs for mac注册码_激活码_产品秘钥_破解版

在Mac上安装这款软件可以很好地解决苹果电脑使用NTFS驱动,使得Mac完美兼容NTFS文件系统.由于这款软件的操作非常简单,一般情况下只要将它安装在Mac中便能解决问题,所以对于Mac来说它就如同一个插件一般存在着.这款软件(tuxera ntfs for mac 破解版)包含一个组件--磁盘管理器,可以帮助用户对磁盘进行一些常规管理,一些简单的修复.挂载.转换均可搞定. Tuxera NTFS 破解版_注册码_激活码_产品秘钥下载地址Tuxera NTFS 2016破解版下载地址 Tuxer

Xshell4中文破解版|附带秘钥

一款很不错的SSH连接工具,win+Linux双向cmd! 秘钥信息 Name: Use Anything You WantCompany: Use Anything You WantSerial: 690313-111999-999313 License is a standard site license of 999 machines. Thats it! Enjoy. 下载地址: http://pan.baidu.com/s/1qWUqtek 密码: q48q

xshell 秘钥

在xshell的客户端里面在工具的选项里面选择新建用户秘钥生成向导 秘钥内向默认是RSA的类型,秘钥长度默认也是2048,长度越长越难破解.一般有2048也就够了. 生成公钥 这边填写秘钥名称可以自己填写,输入用户秘钥的密码 这个就是生成的公钥. 保存公钥文件到指定的文件目录以防以后忘了. 到centos端如下配置: mkdir /root/.ssh chmod 700 /root/.ssh/ vim /root/.ssh/authorized_keys 这个文件原本没有需要自己写 打开新的配置

Android中保存静态秘钥实践(转)

本文我们将讲解一个Android产品研发中可能会碰到的一个问题:如何在App中保存静态秘钥以及保证其安全性.许多的移动app需要在app端保存一些静态字符串常量,其可能是静态秘钥.第三方appId等.在保存这些字符串常量的时候就涉及到了如何保证秘钥的安全性问题.如何保证在App中静态秘钥唯一且正确安全,这是一个很重要的问题,公司的产品中就存在着静态字符串常量类型的秘钥,所以一个明显的问题就是如何生成秘钥,保证秘钥的安全性? 现今保存静态秘钥的几种主流通用做法:(参考:Android安全开发之浅谈

使用PuTTY配置秘钥登陆Linux

打开PuTTYgen,点击Generate生成秘钥.保存私钥. 创建authorized_keys文件$ sudo mkdir ~/.ssh$ sudo vim ~/.ssh/authorized_keys          #粘贴公钥$ sudo chmod 700 ~/.ssh$ sudo chmod 600 ~/.ssh/authoryied_keys 用PuTTY登陆时选择保存好的私钥.

UCloud 的安全秘钥 (计蒜客初赛第五场)(待解决)

20.7% 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb 近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 

计蒜客-第五场初赛-第二题 UCloud 的安全秘钥(简单)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

keytool/JDK 秘钥证书工具用法解析

keytool是一个基于jdk的秘钥证书工具: 在上一篇tomcat集成ssl中,我们使用了keytool生成了.keystore秘钥文件,此篇我们就来介绍下该工具. 先看下前篇的用法 1.keytool生成.keystore,密码及关键信息请自行补足 keytool -genkey -alias tomcat -keyalg RSA -keystore /home/tomcat/.keystore -dname "CN=***,OU=***,O=***,L=SHANGHAI,ST=SH,C=C