POJ - 2447 RSA (RSA公钥密码体制+PollarRho大整数的因数分解)

POJ 2447 破解RSA(经典公钥算法) 周五刚好在俞研的网络安全课上学了RSA,回来想实现以下,由于以前数论方面的积累还算比较深厚,很快就过了这一题,呵呵:-) 总结一下吧,这题可以说是数论部分的一个大综合题,因为它将算法导论上数论这部分的知识点全部包含了进来,包括gcd,扩展gcd,模线性方程,a^b mod c(还是比较难的那种,相关题目可以看一下FOZ上面的2道题),miller-rabin素数测试,pollard_rho质因数 阅读详情

POJ - 2447 RSA

RSA is the best-known public key encryption algorithm. In this algorithm each participant has a private key that is shared with no one else and a public key which is published so everyone knows it. To send a secure message to this participant, you encrypt the message using the widely known public key; the participant then decrypts the messages using his or her private key. Here is the procedure of RSA:

First, choose two different large prime numbers P and Q, and multiply them to get N (= P * Q).
Second, select a positive integer E (0 < E < N) as the encryption key such that E and T= (P - 1) * (Q - 1) are relatively prime.
Third, compute the decryption key D such that 0 <= D < T and (E * D) mod T = 1. Here D is a multiplicative inverse of E, modulo T.

Now the public key is constructed by the pair {E, N}, and the private key is {D, N}. P and Q can be discarded.

Encryption is defined by C = (M ^ E) mod N, and decryption is defined by M = (C ^ D) mod N, here M, which is a non-negative integer and smaller than N, is the plaintext message and C is the resulting ciphertext.

To illustrate this idea, let’s see the following example:
We choose P = 37, Q = 23, So N = P * Q = 851, and T = 792. If we choose E = 5, D will be 317 ((5 * 317) mod 792 = 1). So the public key is {5, 851}, and the private key is {317, 851}. For a given plaintext M = 7, we can get the ciphertext C = (7 ^ 5) mod 851 = 638.

As we have known,for properly choosen very large P and Q, it will take thousands of years to break a key, but for small ones, it is another matter.

Now you are given the ciphertext C and public key {E, N}, can you find the plaintext M? 

Input
The input will contain several test cases. Each test case contains three positive integers C, E, N (0 < C < N, 0 < E < N, 0 < N < 2 ^ 62).
Output
Output the plaintext M in a single line.
Sample Input

638 5 851

Sample Output

7
题意:

破解RSA体系密码

分析:

终于碰到了,太激动了,之前看数论书的时候看到了这一章,专门讲解了RSA公钥密码体制,感觉很有意思,但是就是感觉对比赛没啥用,因为也从没做到过题目,这次终于碰到了,中间设计到很多数论知识的运用,加密的核心其实就是快速幂取模,反之,解密的核心当然就是求k次根了

因此这道题就是求模N的k次根,就可以破解密码

下面是求解过程(有些数论的知识点这里就不赘述了,以后会详细说明,如果不懂的可以搜一搜)


计算同余式xk≡b (mod m)xk≡b (mod m)

1.计算ϕ(m)ϕ(m)

2.求满足ku−ϕ(m)v=1ku−ϕ(m)v=1的正整数u与v(扩展欧几里得)

3.快速幂取模计算bu (mod m)bu (mod m)得到的结果就是我们要求的xx


题目给定了三个变量C,E,N

实际是给定了同余式

ME≡C (mod N)

因此我们要求M找上面的步骤求解即可

我们发现23步好说

对于第一步因为题目告诉了N是两个素数的乘积,什么用呢,当然是用来求欧拉函数ϕϕ

因为对于质数p,ϕ(p)=p−1ϕ(p)=p−1

而欧拉函数是积性函数所有

对于质数p,q

欧拉函数ϕ(pq)=(p−1)×(q−1)ϕ(pq)=(p−1)×(q−1)

因此我们的目标就是分解质因子(很明显N只有两个质因子)

因为数N比较大所以我们只能利用PollarRho大整数的因数分解,同样中间也使用了Miller_Rabin大素数测试

因此我们便可以知道现在题目给定的仅仅是最大10181018左右的数,我们可以利用PollarRho大整数的因数分解以及Miller_Rabin大素数测试分解出质数,但是当我们选择两个足够大的两个素数乘积构成N的时候,什么方法都将失效,要想破解使用最先进的算法和技术都可能需要很多年,因此RSA密码体系是当前比较安全的体系,也是广为使用的加密系统,但是以后有了量子计算机情况就不一样了……

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long ll;
const int S = 8;
ll mul_mod(ll a,ll b,ll c){
    a %= c;
    b %= c;
    ll ret = 0;
    ll tmp = a;
    while(b){
        if(b & 1){
            ret += tmp;
            if(ret > c) ret -= c;
        }
        tmp <<= 1;
        if(tmp > c) tmp -= c;
        b >>= 1;
    }
    return ret;
}

ll q_pow(ll a,ll b,ll mod){
    ll ret = 1;
    ll tmp = a % mod;
    while(b){
        if(b & 1) ret = mul_mod(ret,tmp,mod);
        tmp = mul_mod(tmp,tmp,mod);
        b >>= 1;
    }
    return ret;
}

bool check(ll a,ll n,ll x,ll t){
    ll ret = q_pow(a,x,n);
    ll last = ret;
    for(int i = 1; i <= t; i++){
        ret = mul_mod(ret,ret,n);
        if(ret == 1 && last != 1 && last != n - 1) return true;
        last = ret;
    }
    if(ret != 1) return true;
    return false;
}

bool Miller_Rabin(ll n){
    if(n < 2) return false;
    if(n == 2) return true;
    if((n & 1) == 0) return false;
    ll x = n - 1;
    ll t = 0;
    while((x & 1) == 0){
        x >>= 1;
        t++;
    }
    for(int i = 0; i < S; i++){
        ll a = rand() % (n - 1) + 1;
        if(check(a,n,x,t))
            return false;
    }
    return true;
}

ll factor[100];
int tot;

ll gcd(ll a,ll b){
    ll t;
    while(b){
        t = a;
        a = b;
        b = t % b;
    }
    if(a >= 0) return a;
    else return -a;
}

ll pollard_rho(ll x,ll c){
    ll i = 1, k = 2;
    ll x0 = rand() % (x - 1) + 1;
    ll y = x0;
    while(1){
        i++;
        x0 = (mul_mod(x0,x0,x) + c) % x;
        ll d = gcd(y-x0,x);
        if(d != 1 && d != x) return d;
        if(y == x0) return x;
        if(i == k){
            y = x0;
            k += k;
        }
    }
}

void findfac(ll n,int k){
    if(n == 1) return;
    if(Miller_Rabin(n)){
        factor[tot++] = n;
        return;
    }
    ll p = n;
    int c = k;
    while(p >= n){
        p = pollard_rho(p,c--);
    }
    findfac(p,k);
    findfac(n/p,k);
}
ll ex_gcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x = 1;
        y = 0;
        return a;
    }
    ll d = ex_gcd(b,a%b,y,x);
    y -= a / b * x;
    return d;
}
ll getinv(ll a,ll b){
    ll x,y;
    ll g = ex_gcd(a,b,x,y);
    x = (x % b + b) % b;
    return x;
}
int main(){
    ll C,E,N;
    while(~scanf("%lld%lld%lld",&C,&E,&N)){
        tot = 0;
        findfac(N,107);
        ll phiN = (factor[0] - 1) * (factor[1] - 1);
        ll u = getinv(E,phiN);
        ll ans = q_pow(C,u,N);
        printf("%lld\n",ans);
    }
    return 0;
}
RSA数分解 问题描述RSA数是两个素数的乘积,例如 156287 = 373×419。问题是已知一个RSA数,如何在可接受的时间内将其分解为两个素数。问题分析这个问题是RSA非对称加密算法的核心。非对称的意思就是将一个大数分解质因数的时间远大于将两个素数乘起来的时间。 该问题的难点是指数增长的时间复杂度。即随着两个素数位数的增长,计算量呈指数增长。这被认为是不可解的。问题求解设RSA数为n,朴素的方法是穷举, 阅读详情

相关推荐

华为OD机试 Python【RSA因数分解】

RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个 32 位正整数,请对其进行因数分解,找出是哪两个素数的乘积。,则输出这两个素数;如果遍历完所有可能的因数后未找到符合条件的素数对,则输出“-1 -1”。如果成功找到,以单个空格分割,从小到大输出两个素数,分解失败,请输出-1, -1。一个正整数 num 0 < num < 2147483647。解题思路是首先读取输入的32位正整数。

wtswts1232的博客 338

密码学RSA解密之Pollard_rho分解

对于Pollard_rho,它可以在O(sqrt§)的时间复杂度内找到n的一个小因子p,所以当n的两个素因子差距过大,即有一方过小的话都可以通过Pollard_rho进行分解 例题: n = 1141976890333971618926153237155970525208639827587600850504737512307472709358968061186974826335155409395796814234383133165460693268476704295842740957911543544518

weixin_44145452的博客 1490

RSA算法的素因子分解实现

其中一个重要的步骤是生成RSA公钥和私钥的过程,其中私钥是通过对两个大素数的乘积进行素因子分解来计算的。然而,需要注意的是,素因子分解是一项复杂而耗时的计算任务,特别是对于大素数来说。在RSA算法中,公钥由两个大素数的乘积N组成,而私钥是这两个素数的素因子之一。因此,我们的目标是通过已知的公钥N来找到两个大素数p和q,从而可以计算出私钥。请注意,素因子分解是一个非常耗时的计算过程,尤其是对于较大的素数。函数接收公钥N作为输入,并尝试进行素因子分解,返回找到的两个素数p和q。RSA算法的素因子分解实现。

BUG?不存在的! 292

RSA常见攻击分析(一)

RSA常见攻击分析(一) 文章目录RSA常见攻击分析(一)一、试除法二、Pollard rho方法三、pollard p-1方法四、 费马分解五、 二次筛法 一、试除法 所谓试除法,就是使用比n小的数一个个的去尝试除n,当尝试的数可以整除n,就说明该数是n的一个因子,即完成对n的分解。我们很容易看出试除法的本质就是一种暴力分解n的方法,所以如果n本身比较大且n的因子也十分大的时候,这个方法需要运行很长时间,所以在生成RSA公钥密码体系,要求n的两个因子都要取比较大的数 ```python 例如: im

qq_52648141的博客 860

38、RSA与因式分解问题的深入剖析

本文深入剖析了RSA加密算法与整数因式分解问题之间的紧密联系,重点探讨了基于LLL格基约简算法和Coppersmith方法在密码分析中的核心作用。内容涵盖秘密指数d的计算与模数N因式分解的等价性、寻找光滑数对经典因式分解算法的启发、针对小私钥指数的Wiener与Boneh-Durfee攻击、部分密钥暴露攻击的安全含义与应用,以及利用牛顿多面体优化求根界限的理论挑战。文章还总结了相关技术在RSA分析中的多种应用场景,并展望了消除误差项、提升多元情形可证明性及结合外包计算的发展方向。

blue的专栏 101

RSA因数分解工具yafu

yafu用于自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法与Pollard rho方法等。

RSA算法

两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,  (2013-07-12 23:04:25) 转载▼   转自:http://blog.sina.com.cn/s/blog_4a0fa5420101f2lj.html RSA算法 百科名片    发明RSA算法的三个人 RS

worldy的专栏 2041

rsa因数分解+随机生产公私钥

rsa因数分解+随机生产公私钥

万字解析,RSA基础攻击方式(实战因数分解、共享素数、低加密指数攻击等情况)

当同时生成了多个公钥,如果生成的公钥中有两组N使用了相同的素数,而这两组N不互素,那我们可以通过求这两组N的最大公因数得到p、q,从而获得RSA的私钥。(说明: 这个示例中的数字非常小,主要是为了便于理解RSA加密的原理,通常会选择非常大的素数,如2048位或更长来计算密钥和进行加密解密操作。当在生成p,q时如果选取的素数不当,造成两个素数的值过于接近,那么可以尝试对其进行分解。因此,使用共模攻击,在不对N进行分解的情况下,进行对明文的解密。,就可以枚举得到p或者q,从而完成N的分解,生成私钥。

晓梦林的博客 2070

MOSFET开关损耗全面讲解:从原理到优化策略

深入剖析MOSFET开关损耗的产生机制,结合实际应用场景,讲解如何通过驱动设计和电路优化降低损耗,提升系统效率。重点关注mosfet在高频开关下的表现与热管理。

weixin_29476595的博客 1058

openEuler Embedded新增软件包及在线安装软件方法

openEuler Embedded是基于Yocto构建的嵌入式操作系统,默认不包含dnf/apt软件包管理器,主要使用rpm格式。新增软件需通过manifest文件检查是否集成,未集成则需适配新配方。对于在线安装需求,可采用轻量级容器方案:通过isulad运行openEuler服务器版容器镜像,在容器内使用dnf命令安装软件(如Nginx),实现服务器生态兼容。部署前提包括设备支持、存储空间(≥10GB)和网络连接,需先安装并启动isulad服务。这种方法结合了嵌入式系统的轻量化特性和服务器系统的软件管理

专注嵌入式开发与 Linux 系统应用实战,分享芯片驱动、设备调试、系统工具开发干货。 1225

RSA算法原理

一、一点历史 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加密; (2)乙方使用同一种规则,对信息进行解密。 由于加密和解密使用同样规则(简称”密钥”),这被称为“对称加密算法”(Symmetric-key algorithm)。 这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最

runninghui的专栏 2585

微信小程序 实现拼图功能

微信小程序 实现碎片拼图

weixin_45689786的博客 2250

Crypto--RSA因数分解

0x00 题目链接:https://www.ichunqiu.com/battalion?q=4623 下载后打开rsa.txt,看到提供的参数 n(两个大素数p、q的乘积) e(公钥) c(密文) 0x01 对n进行因数分解 如果n比较小,那么可以通过工具进行直接n分解,从而得到私钥。如果n的大小小于256bit,那么我们通过本地工具即可爆破成功。例如采用windows平台的RSATool2v...

yumengzth的博客 1万+

Cadence Sigrity PowerDC实战:如何用PCB电热混合仿真解决散热难题(附详细配置步骤)

本文详细介绍了如何利用Cadence Sigrity PowerDC进行PCB电热混合仿真,以解决高功率密度设计中的散热难题。文章通过解析电热耦合原理,并附上详细的配置步骤与实战技巧,指导硬件工程师同步优化电气性能与热管理,从而在设计源头提升产品可靠性与效率。

weixin_29292535的博客 196

Zabbix故障排查10051端口无法启动:zabbix-server.service: main process exited, code=exited, status=1/FAILURE

zabbix-server.service: main process exited, code=exited, status=1/FAILURE报错说与数据库失去连接。

" DevOps菜鸟(Xu JieHao)" 的博客 2255

密码学基础三-RSA非对称密码实验(2),2024年最新学习Binder前必须要了解的知识点

是一种。对极大整数做的决定了RSA算法的。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

2401_84239525的博客 1000

【txt文本加密】使用 cryptography 库实现加密和解密

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2666

POJ - 2447 RSA (PollarRho大整数的因数分解)

RSA is the best-known public key encryption algorithm. In this algorithm each participant has a private key that is shared with no one else and a public key which is published so everyone knows it. To send a secure message to this participant, you encrypt

hyesuixin的博客 1061

【Envi遥感图像处理】022:envi时空分析工具的使用

本文介绍了ENVI软件中的时空分析工具应用,以美国拉斯维加斯1975-2014年的9期Landsat数据为例。主要内容包括:1)时空分析概念,即对空间相关时间序列数据的建模分析;2)构建时序数据流程,通过添加栅格、时间排序等步骤生成.series格式时序文件;3)时序数据查看方法,包括动画播放、添加注记及保存视频;4)多源数据统一处理工具,解决坐标系、空间范围不一致问题。该工具可用于冰川变化、植被覆盖等时空变化研究。

智慧空间实验室 270

virtuoso如何导出def?

在DEF Out界面,填写def name,library name以及cell name ,cell view既layout,把Output "Floating Shapes" into SPECIAL NETS Section勾上,OK即可。2)在要导出的layout界面选中PAD和prBoundary(shift+左键),快捷键C copy到空cell里,这时需要调整copy过来的object坐标,让两边prBoundary的坐标相同。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 2304

RSA算法描述

1.简单介绍 1.RSA是应用十分普遍,技术也是最成熟、最完善的公钥密码体制。 2.RSA是基于大整数因子分解的困难问题 2.密钥的产生 (1)选两个保密的大素数

zzdxls的博客 1124

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

POJ 2447 RSA —— RSA加密算法的破解过程

RSA Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3358   Accepted: 709 Description RSA is the best-known public key encryption algorithm. In this algorithm

XMzhou的专栏 1191

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RSA算法原理(二)

RSA算法原理(二) 转载:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 上一次,我介绍了一些数论知识。 有了这些知识,我们就可以看懂RSA算法。这是目前地球上最重要的...

1278

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RSA算法数学原理及质因数分解

RSA算法数学原理及质因数分解

yaosichengalpha的博客 999

RSA密码体制和整数因子分解

RSA密码体制和整数因子分解 整理于2020年5月25日 大整数分解算法 Pollard p-1 算法 原理分析 设p为n的一个素因子,且p−1=∏i=1sqαip-1=\prod_{i=1}^{s}q^{\alpha_{i}}p−1=∏i=1s​qαi​ ⇒∃ B,∀qαi,B>qαi\Rightarrow \exist \,B,\forall q^{\alpha_{i}},B>q^{\alpha_{i}}⇒∃B,∀qαi​,B>qαi​ 令a=2B!mod na=2^{B!}mod \

panfengblog 3033
上一篇: POJ1811 Prime Test(Miller_Rabin素性测试+Pollard_rho质因子分解模板)
下一篇: POJ2417 Discrete Logging (离散对数取模)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值