HDU 1211 RSA (逆元)
2015-10-25 14:55
447 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1211
题意:
给出加密后的信息和加密解密方法要求出,解密后的信息。
方法如下:
1)给出p q e l, 先求出n = p * q, f = (p - 1) * (q - 1)
2) C = E(m) = me mod n (m为原信息,保证gcd(e,
f) = 1)
3)M = D(c) = cd mod
n (c为加密后的信息),求d,使得满足d × e mod f = 1 mod f,然后用 d 解密出信息
思路:关键是求d,易得d mod f = (1 mod f)/ e,即 d 为 mod f 的运算下 e 的逆元,照着模版打就行了。
题意:
给出加密后的信息和加密解密方法要求出,解密后的信息。
方法如下:
1)给出p q e l, 先求出n = p * q, f = (p - 1) * (q - 1)
2) C = E(m) = me mod n (m为原信息,保证gcd(e,
f) = 1)
3)M = D(c) = cd mod
n (c为加密后的信息),求d,使得满足d × e mod f = 1 mod f,然后用 d 解密出信息
思路:关键是求d,易得d mod f = (1 mod f)/ e,即 d 为 mod f 的运算下 e 的逆元,照着模版打就行了。
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <stdlib.h> #define INF 0x7fffffff #define MOD 1000000007 using namespace std; typedef long long ll; ll extgcd(ll a, ll b, ll& x, ll& y) { ll d = a; if(b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else { x = 1; y = 0; } return d; } ll mod_inverse(ll a, ll m) { ll x, y; extgcd(a, m, x, y); return (m + x % m) % m; } ll mod_pow(ll x, ll n, ll mod) { ll res = 1; while(n > 0) { if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } int main() { #ifdef LOCAL freopen("data.in", "r", stdin); #endif ll p, q, e, l, num; while(scanf("%I64d%I64d%I64d%I64d", &p, &q, &e, &l) != EOF) { ll n = p * q, f = (p - 1) * (q - 1); ll d = mod_inverse(e, f); //printf("n=%I64d f=%I64d d=%I64d\n", n, f, d); for(int i = 0; i < l; i++) { scanf("%I64d", &num); printf("%c", mod_pow(num, d, n)); } printf("\n"); } return 0; }
相关文章推荐
- Awesome Big Data,了不起的大数据
- 建工发债sql
- GCD 信号量
- MAVEN打包丢失xml文件解决办法
- Oct 25th
- strstr函数
- 洛谷 1195 口袋的天空
- Linux第六次学习笔记
- linux日志信息
- 【知识点整理(Java)】Java Thread简单使用注意点汇总(二)
- 关于c语言指针的学习总结1
- Duilib应用之标签页(TabLayout)的使用
- linux centos 7安装 mariadb
- ailab-mltk 机器学习整合包 [广告]
- 总结js中数据类型的bool值及其比较
- 动态规划-最长公共子序列
- 在JSP中动态生成随机验证码,登录时后台校验验证码,以及如何避免同一个验证码被重复提交爆破密码
- codeforces 0 和5
- jxl创Excel档java示例代码说明
- 呵呵哒