第十届蓝桥杯 RSA解密(C++/ java)

一道不错的题目,借鉴了网上的代码,用了拓展欧几里得算法求逆元,再用快速乘求每次a的余数,再快速幂对余数进行幂运算。
#include <bits/stdc++.h>
using namespace std;
long long n=;
long long d=;
long long c=;
long long p=;
long long q=;
long long e=;
long long phi=(p-)*(q-);
void Ex_gcd(long long a,long long b,long long &x,long long &y) // 欧几里得算法求逆元
{
if(b==)
{
x=;
y=;
return ;
}
long long x1,y1;
Ex_gcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
}
long long quickmul(long long a,long long b) //快速乘求每次的余数
{
long long sum=;
while(b)
{
if(b%==)
sum=(sum+a)%n;
a=(a+a)%n;
b=b/;
}
return sum;
}
long long quickmod(long long a,long long b) //快速幂
{
long long ans=;
while(b)
{
if(b%==)//末位是1;
ans=quickmul(ans,a);//这是直接的回溯法,从最后一位起,如果,如果最后一位是1,则乘a,然后在进行乘以它本身,以为乘1之后一定为偶数,也就是b/2;
a=quickmul(a,a);
b=b/;
}
return ans;
}
int main()
{
long long x,y;
Ex_gcd(d,(q-)*(p-),x,y);
x=(x+phi)%phi; //让x为正
printf("e=%lld\n",x);
printf("ans=%lld\n",quickmod(c,e));
return ;
}
如果第一次接触扩展欧几里得算法,可以看下面几篇博文,我靠着这几篇逐步弄懂代码的,虽然c++不太会。
按着顺序看,反正我是这么过来了,前提是得知道欧几里得算法,呕心沥血。
https://note.youdao.com/ynoteshare1/index.html?id=3f0c60d22c0a3016642df397ded87a2f&type=note
https://cloud.tencent.com/developer/article/1433267
https://blog.csdn.net/stray_lambs/article/details/52133141
// ---------更新-----------,java 版本的代码
// --2020.2.10 (武汉加油!)
public class Main {
// static BigInteger n = new BigInteger("1001733993063167141");
static long n = 1001733993063167141L; //java 大数转为long,记得后面最后面那个是l/L
static long d=212353;
static long c=20190324;
static long p=891234941;
static long q=1123984201;
// static BigInteger e = new BigInteger("823816093931522017");
static long phi=(p-1)*(q-1);
static long e = 1;
static long x1 = 0, y1 = 0;
static long ans = 1;
//求解p和q的
// static long p = 2;
// static long q = 0;
// public static void qiue() {
// while(n % p != 0)p++;
// q = n / p;
// }
public static long quickmod(long a, long b) { // ---分界线---
long x = 0;
while(b != 0) {
if(b % 2 == 1) {
x = (x + a) % n;
}
a = (a + a) % n;
b /= 2;
}
return x;
}
// 用快速幂求模,每次求模后余数相乘,得到最后的答案
// 每当要用到乘法时,用快速乘,再模,求余数
public static void quickmul(long c, long e) {
while(e != 0) {
if(e % 2 == 1) {
ans = quickmod(ans, c);
}
e /= 2;
c = quickmod(c, c);
}
} // ---分界线---
public static void gcd(long i, long j, long a, long b) { //欧几里得扩展求乘法逆元
if(j == 0) {
x1 = 1;
y1 = 0;
return;
}
gcd(j, i % j, x1, y1);
long temp = x1;
x1 = y1;
y1 = temp - i / j * y1;
e = x1;
return ;
}
public static void main(String[] args){
gcd(d, phi, x1, y1);
e = (e + phi) % phi;
System.out.println(e);
quickmul(c, e);
System.out.print(ans);
}
}
e的答案是:823816093931522017
最后的答案是:579706994112328949
第十届蓝桥杯 RSA解密(C++/ java)的更多相关文章
- 2019年第十届蓝桥杯c++A组java/c++组题解
#include<iostream> #include<vector> using namespace std; vector <int > vec; long l ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 第十届蓝桥杯2019年C/C++ 大学B组省赛试题
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...
- 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)
先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...
- 2019年第十届蓝桥杯【C++省赛B组】
试题 A: 组队 本题总分:5 分 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容.每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算首发阵容 ...
- 第十届蓝桥杯JavaB组省赛真题
试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...
- 第十届蓝桥杯JavaC组省赛真题
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人
扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...
- Java实现第十届蓝桥杯外卖店优先级
试题 G: 外卖店优先级 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] "饱了么"外卖系统中维护着 N 家外卖店,编号 1 ∼ N.每家外卖店 ...
随机推荐
- 【JavaWeb】导入Excel并进行校验
一.需要实现的目标 1.界面编写 2.导入表读取表名,进行校验,后台匹配(判断此表的名称是否能够模糊匹配上) 3.确定表存在,读取其中的数据,暂存 4.正则表达式数据校验(判断是否已存在,数据是否符合 ...
- opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)
未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...
- The Last Puzzle ZOJ - 3541
题目链接 本题也是区间dp,贪心可证,每一次出发必定是从端点,否则必然有重复,不会是最小值,那我们可以设dpi,j,0/1,0代表从左端点出发,1代表从右端点,因为每次都是从端点出发,状态方程为 dp ...
- Redis学习笔记(一)配置文件参数说明
1.Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2.当redis以守护进程方式运行时,Redis默认会把pid写入/var/run/ ...
- 文本输入框UITextField和UITextView
本文概要 1.简介 2.介绍TextField控件 3.介绍TextView控件 4.键盘的打开和关闭 5.关闭和大开键盘的通知 6.键盘的种类 详情 1.简介 与Label一样,TextField和 ...
- spark实验(二)--scala安装(1)
一.实验目的 (1)掌握在 Linux 虚拟机中安装 Hadoop 和 Spark 的方法: (2)熟悉 HDFS 的基本使用方法: (3)掌握使用 Spark 访问本地文件和 HDFS 文件的方法. ...
- BugkuCTF解题Web基础(一)
Web2 打开链接看见一张动图,猜测flag应该就在网页前端源码里面 没有问题 计算器 典型的修改前端代码题目,题目让你计算结果,但只能填写一位数字. f12打开控制台,改代码maxlength we ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:标题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Android FM模块学习之四源码解析(一)
转自:http://blog.csdn.net/tfslovexizi/article/details/41516149?utm_source=tuicool&utm_medium=refer ...
- java各种面试问题
二.Java多线程相关 线程池的原理,为什么要创建线程池?创建线程池的方式: 线程的生命周期,什么时候会出现僵死进程: 说说线程安全问题,什么实现线程安全,如何实现线程安全: 创建线程池有哪几个核心参 ...