URAL 1141. RSA Attack(欧拉定理+扩展欧几里得+快速幂模)
题意 : 给你n,e,c,并且知道me ≡ c (mod n),而且n = p*q,pq都为素数。
思路 : 这道题的确与题目名字很相符,是个RSA算法,目前地球上最重要的加密算法。RSA算法原理 。
看到这个算法之后,就知道这个题是求cd≡m(mod n),要求m,就要先求d,而d则是e的模反元素。
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。这时,b就叫做a的模反元素。
由模反元素可知,ed≡1(mod Phi[n])(phi[n]代表n的欧拉函数)。
根据欧拉函数性质可知,phi[n] = (p-1)*(q-1)。
求e的逆元d需要用扩展欧几里得,ed+k*phi[n]=1.要注意处理求出的d是负数的情况。
最后求cd就要用到快速幂模,然后再MOD n 就是所求m。
#include <stdio.h>
#include <string.h>
#include <iostream>
typedef long long LL ; using namespace std ; bool isprime(int n)
{
for(int i = ; i * i <= n ; i++)
{
if(n % i == ) return false ;
}
return true ;
}
int multimod(int a,int n,int m)
{
int tmp = a , res = ; while(n)
{
//printf("11\n") ;
if(n & )
{
res *= tmp ;
res %= m ;
}
tmp *= tmp ;
tmp %= m ;
n >>= ;
//printf("%d\n",n) ;
}
return res ;
}
void exde(int a,int b,int &x,int& y)
{
int t ;
if(b == )
{
x = ;
y = ;
return ;
//return a;
}
exde(b,a%b,x,y) ;
t = x ;
x = y ;
y = t-(a/b)*y;
//return d ;
}
int main()
{
int T ,e,c,n;
scanf("%d",&T) ;
while(T--)
{
scanf("%d %d %d",&e,&n,&c) ;
int p,q ,x,y;
//printf("1\n");
for(int i = ; i * i <= n ; i++)
{
if((n % i == ) && isprime(i) && isprime(n / i))
{
p = i ;
q = n / i ;
break ;
}
}
//printf("p = %d q = %d\n",p,q) ;
exde(e,(p-)*(q-),x,y);
//printf("%d %d\n",p,q) ;
int d = x ;
//printf("%d\n",d+(p-1)*(q-1)) ;
if(d < )
d = (d+(p-)*(q-)) %((p-)*(q-)) ;
//printf("%d\n",d) ;
int ans = multimod(c,d,n) ;
printf("%d\n",ans) ;
}
return ;
}
URAL 1141. RSA Attack(欧拉定理+扩展欧几里得+快速幂模)的更多相关文章
- bzoj 2242: [SDOI2011]计算器【扩展欧几里得+快速幂+BSGS】
第一问快速幂板子 第二问把式子转化为\( xy\equiv Z(mod P)\rightarrow xy+bP=z \),然后扩展欧几里得 第三问BSGS板子 #include<iostream ...
- URAL 1141. RSA Attack RSA加密演算法
标题来源:URAL 1141. RSA Attack 意甲冠军:给你e n c 并有m^e = c(mod n) 求 m 思路:首先学习RSA算法 here 过程大致是 1.发送的信息是m 2.随机选 ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
- 2^x mod n = 1(欧拉定理,欧拉函数,快速幂乘)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...
- 1141. RSA Attack(RSA)
1141 越来越喜欢数论了 很有意思 先看个RSA的介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n ...
- URAL 1204. Idempotents (扩展欧几里得)
题目链接 题意 : 给你一个同余方程, x*x ≡ x (mod n),让你求出所有的小于n的x. 思路 : 先来看同余的概念 :给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a ...
- HDU1211 密文解锁 【扩展欧几里得】【逆元】
<题目链接> <转载于 >>> > 题目大意: RSA是个很强大的加密数据的工具,对RSA系统的描述如下: 选择两个大素数p.q,计算n = p * q,F( ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)
http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...
随机推荐
- Java-Maven-Runoob:Maven POM
ylbtech-Java-Maven-Runoob:Maven POM 1.返回顶部 1. Maven POM POM( Project Object Model,项目对象模型 ) 是 Maven 工 ...
- angular 本地存储
localStorage四种方法: localStorage.getItem(key):获取指定key本地存储的值localStorage.setItem(key,value):将value存储到ke ...
- c语言活动记录-图解(一)
来源: 1.<代码揭秘>第六章函数与函数调用 2.http://blog.csdn.net/zhuliting/article/details/6839233 引入话题: 局部变量是动态分 ...
- js是这样判断值的数据类型的
js如何判定给定值的数据类型? typeof typeof "a" // "string" typeof 1 // "number" typ ...
- 第十七章 MySQL Replication(待续)
··········
- JDBC概述及连接数据库
一.JDBC简介: JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...
- 如何将serialport接收的字符串转换成十六进制数c#
关注 baihe_591 baihe_591 本版等级: #1 得分:0回复于: 2008-06-02 09:44:00 Byte[] byte=new Byte[1];byte=0xf1;por ...
- leetcode594
public class Solution { public int FindLHS(int[] nums) { Dictionary<int, int> dic = new Dictio ...
- 监控和安全运维 1.8 zabbix服务端安装
1. Zabbix简介基于web的开源软件,开源监控系统状态也可以监控网络设备.和nagios不同的是zabbix会把获取的数据保存在数据库中,所以zabbix需要有数据库支持 Zabbix还可以自动 ...
- log4net 入门教程
1.下载dll 下载地址:http://mirror.reverse.net/pub/apache/logging/log4net/binaries/ github:https://github.co ...