博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URAL 1141. RSA Attack RSA加密演算法
阅读量:7048 次
发布时间:2019-06-28

本文共 1218 字,大约阅读时间需要 4 分钟。

标题来源:

意甲冠军:给你e n c 并有m^e = c(mod n) 求 m

思路:首先学习RSA算法  

过程大致是

1.发送的信息是m

2.随机选择两个质数 p和q, n = q*p, n的欧拉函数值φ(n)= (p-1)*(q-1)这个须要证明 

3.选择一个与φ(n)互质的而且小于φ(n)的数e, 计算c = m^e(mod n)

4.发送c

5解密 求e的逆元d 逆元就是2个数乘一下在mod一个数等于1 这里就是e*d = 1(mod φ(n))

求逆元用扩展欧几里德或者直接求高速幂

6.计算c^d(mod n) 就是m

#include 
#include
#include
using namespace std;//返回a^p mod n 高速幂int pow_mod(int a, int p, int n){ int ans = 1; while(p) { if(p&1) { ans *= a; ans %= n; } a *= a; a %= n; p >>= 1; } return ans;}bool prime(int x){ for(int i = 2; i*i <= x; i++) { if(x%i == 0) return false; } return true;}int main(){ int T; scanf("%d", &T); while(T--) { int e, n, c; scanf("%d %d %d", &e, &n, &c); int p, q; for(int i = 2; i*i <= n; i++) { if(n%i == 0 && prime(i) && prime(n/i)) { p = i; q = n/i; break; } } int x = (p-1)*(q-1), y = x; for(int i = 2; i*i <= n; i++) { if(x % i == 0) { y = y / i * (i-1); while(x % i == 0) x /= i; } } if(x > 1) y = y / x * (x-1); int inv = pow_mod(e, y-1, (p-1)*(q-1)); printf("%d\n", pow_mod(c, inv, n)); } return 0;}

 

版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4663333.html,如需转载请自行联系原作者

你可能感兴趣的文章
线程的优先级
查看>>
AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
查看>>
从EXCHANGE 2010的DAG中删除其中一个MEMBER
查看>>
Ehcache学习笔记
查看>>
Tomcat 内存溢出对应解决方式
查看>>
Mac下 Thinkphp3.2 语言包问题
查看>>
你意想不到的的编程问题
查看>>
Web Service学习总结
查看>>
新手学JAVA(七)----Override VS Overload
查看>>
执行 Maven 编译的 jar,找不到相关的 依赖的类--使用 maven-assembly-plugin 解决
查看>>
【转载】POC(Proof of Concept)
查看>>
使用CSS制作文字环绕图片效果(文字内容包含<li>标签)
查看>>
UITextField使用的一些细节
查看>>
js冒泡
查看>>
计算Pan手势到指定点的角度
查看>>
解决wubi安装ubuntu时要下载系统映像文件问题
查看>>
Spring中使用inner bean
查看>>
android 地址控件概述
查看>>
非IE浏览器实现onmouseenter
查看>>
Redis、Memcache和MongoDB的区别
查看>>