[POJ2447] RSA

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

http://poj.org/problem?id=2447

题目大意:

一个公钥密钥系统,给出C(密文),{E, N}公钥,要求破解出原文M


解题思路:

思路其实很简单。

1)由N破解出P和Q,得到T=(P-1)*(Q-1)

用PollardRho找出一个的质数因子(经过验证,不需要MillerRabin和二分配合,因为这个n肯定只有P和Q这两个非平凡因子)

PS:代码换过,不过注释掉的MillerRabin和二分部分继续留着,可以过POJ1811~

2)用扩展欧几里得求D

由于E和T是互质的,也就是gcd(E, T)=1。 (E * D) mod T = 1。用扩展欧几里得求解欧几里得方程E*D+T*K=gcd(E, T)=1即可。

最后用D=(D%T+T)%T处理了一下,也不确定是否必须。WA了无数次,这里写成%N了,坑爹啊!

3)pow_mod(C, D, N)


源代码:

其中很多模板都是用别人的,网上搜了几个源代码发现都TLE或者WA了,所以把自己这个拼凑的和尚的破袈裟贴一下……

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <limits.h>
#include <ctime>
using namespace std;

#define int64_t __int64
#define TIME 100

int64_t gcd(int64_t a,int64_t b)
{
    while(b)
    {
        int64_t t=a%b;
        a=b;
        b=t;
    }
    return a;
}

int64_t mul_mod(int64_t a, int64_t b, int64_t n){
    int64_t tmp=0;
    while(b)
    {
        if(b&1){
            tmp+=a;
            tmp%=n;
        }
        a<<=1;
        a%=n;
        b>>=1;
    }
    return tmp;
}

int64_t pow_mod(int64_t a, int64_t n,int64_t m)
{
    int64_t p=1;
    for(int64_t i=1;i<=n;i<<=1)
    {
        if(i&n) p=mul_mod(p,a,m);
        a=mul_mod(a,a,m);
    }
    return p;
}

int64_t usr_abs(int64_t x){return x>0?x:-x;}

//bool MillerRabin(int64_t n, int tries) //Return true if prime
//{
//    if(n==1) return false;
//    if(n==2||n==3) return true;
//    if(!(n&1)) return false;
//    int64_t d=n-1;
//    int s=0;
//    while(!(d&1)) {d>>=1;s++;}
//    while(tries--)
//    {
//        int64_t x=pow_mod(usr_abs((int64_t)rand())%(n-3)+2,d,n),y;
//        for(int j=0;j<s;j++)
//        {
//            y=mul_mod(x,x,n);
//            if(y==1&&x!=1&&x!=n-1) return false;
//            x=y;
//        }
//        if(x!=1) return false;
//    }
//    return true;
//}


int64_t PollardRho(int64_t n) //n shouldn't be prime
{
    if(!(n&1)) return 2;
    while(true)
    {
        int64_t x=usr_abs((int64_t)rand())%n,y=x;
        int64_t c=usr_abs((int64_t)rand())%n;
        if(c==0||c==2) c=1;
        for(int i=1,k=2;;i++)
        {
            x=mul_mod(x,x,n);
            if(x>=c) x-=c; else x+=n-c;
            if(x==n) x=0;
            if(x==0) x=n-1; else x--;
            int64_t d=gcd(x>y?x-y:y-x,n);
            if(d==n) break;
            if(d!=1) return d;
            if(i==k) {y=x;k<<=1;}
        }
    }
}

//int64_t get_small(int64_t n)
//{
//    int64_t m, tmp1, tmp2;
//    if (MillerRabin(n, TIME)) return n;
//    m=PollardRho(n);
//    tmp1=get_small(m);
//    tmp2=get_small(n/m);
//    return tmp1<tmp2?tmp1:tmp2;
//}

//Solve ax+by=(a,b)
void gcd_solve(int64_t a, int64_t b, int64_t &x, int64_t &y)
{
    if (b==0){x=1;y=0;}
    else
    {
        gcd_solve(b,a%b,y,x);
        y-=a/b*x;
    }
}

int main()
{
    int64_t C, E, N, P, Q, T, D, K, M;
    srand((unsigned int)time(NULL));
    while (cin>>C>>E>>N)
    {
        //Get P and Q ==> T
        P=PollardRho(N);
//        P=get_small(N);
        Q=N/P;
        T=(P-1)*(Q-1);
        //Find D. Here D is a multiplicative inverse of E, modulo T. 
        //ED mod T = 1   ==> ED+KT=1  而gcd(E,T)==1,即求解E*D+T*K = (E, T)
        gcd_solve(E, T, D, K);
        D=(D%T+T)%T;
        //M = (C ^ D) mod N
        cout<<pow_mod(C, D, N)<<endl;
    }
    return 0;
}



POJ 2447 RSA(大整数分解质因数+逆元) 题意:已知RSA的加密过程,balabala.....(其实就是主要就是让你求一个大整数分解的结果)。 思路:这道题可以用 POJ  1811 的做法,把正整数n分解,时间复杂度大约为O(n^(1/4)). 传送门: 剩下要做的就是用扩展欧几里得算法求逆元,然后求一个快速幂就可以了。 这道题这种做法跑得还是很快的,大约250ms左右。 #include #include #include 阅读详情

相关推荐

RSA加密

RSA算法基于一个事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 具体流程是: hdu 1211 RSA http://acm.hdu.edu.cn/showproblem.php?pid=1211 按照题目所讲的步骤来就行。 #include #include using namespace std;

theArcticOcean 1139

POJ1811米勒罗宾模板

#include #include #include #include #include using namespace std; typedef long long int64; templateinline bool updateMin(T& a, T b){ return a > b ? a = b, 1: 0; } templateinline bool updateMax(T&

博客搬家啦 667

VLOOKUP_fixed.py

VLOOKUP_fixed.py

POJ 2447 RSA

测试了一下pollard_rho中那个随机的C,时间差了有近200+ms #include #include #include #include #include #include #include #include #include #include #define oo (1<<28) #define gcc 1212321 using namespace std; ty

Learn as if you were to live forever 838

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Poj 2447 RSA

/** * url: http://poj.org/problem?id=2447 * stratege: Pollard_Rho整数分解, 快速模取幂, 逆元求解, 扩展欧几里德 * Author:Johnsondu (chennyDu) * Time: 2012-10-16 20:06 Around * Status: 10921637 a312745658 2447 Accept

小do在努力 1344

拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?

本文深度解析了博世和大陆的电子机械制动(EMB)技术,重点探讨了自增力机构如何实现83%的能耗节省。通过对比电机直驱型和自增力型EMB的技术参数,揭示了自增力机构在能量优化和系统集成方面的创新优势,为汽车电动化和智能化提供了关键技术支持。

weixin_42665725的博客 391

POJ2447 RSA【公匙密码】

题目大意: RSA是个有名的公匙密码系统。在这个系统中,每个参与者有一个只能自己知道的私匙和一个每个人都 知道的公匙。为了安全地把信息传递给对方,应该用公匙对信息进行加密,对方用自己的私匙进行解密。 对RSA系统的描述如下: 首先,选择两个大素数P、Q,计算N = P * Q。 然后,选择一个正整数E作为加密密匙,令T = (p-1)*(q-1),且gcd(E,T) = 1。 最后,计算解密密匙D,使得(E * D) mod T = 1,这里D是E模T的逆元。 公匙表示为{E,N},私匙表示为{D,N},P

程序员充电站(itcharge) 1598

线性代数知识点整理

线性代数基础知识点摘要整理

cuguanren的博客 3万+

matsim教程及其案例

MATSim 是一个强大的交通仿真工具,适合研究交通政策、出行行为优化和城市规划。建议从官方示例入手,逐步尝试修改参数和扩展功能。遇到问题时,优先查阅官方文档和社区讨论。(Multi-Agent Transport Simulation Toolkit)的教程和案例资源整理,涵盖基础入门、核心概念、实际应用案例及学习路径。MATSim 是一个开源的、基于多智能体的交通仿真框架,用于模拟城市交通系统中的出行行为、交通流量和交通政策影响。

weixin_70682362的博客 1093

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

【maxENT】从数据到地图:R语言实现最大熵物种分布建模全流程解析

本文详细解析了如何使用R语言实现最大熵模型(MaxEnt)进行物种分布建模的全流程。从数据准备、环境变量处理到模型训练与参数调优,再到模型评估与结果可视化,提供了实用的代码示例和避坑指南。特别适合生态学研究者利用最大熵模型处理物种分布数据,提升研究效率。

weixin_27244795的博客 216

POJ 2447 RSA 解公钥密码

点击打开链接 RSA Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3415   Accepted: 729 Description RSA is the best-known public key encryption algorithm. In th

代码改变世界,keep coding。 1365

别再傻傻分不清了!Anaconda和Miniconda到底选哪个?附保姆级安装与镜像源配置(Windows/Mac)

本文详细解析了Anaconda和Miniconda的核心差异,包括体积、预装内容、系统资源占用等关键维度,并提供了针对不同需求的决策框架。附有Windows和Mac双平台的详细安装与配置指南,帮助用户根据实际需求选择最适合的conda工具,提升开发效率。

weixin_30315723的博客 426

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6488

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

【人工智能】广度优先搜索(BFS)在人工智能中的应用(Python源码)

本文系统阐述了广度优先搜索(BFS)算法在人工智能领域的核心原理与应用。作为无信息搜索算法,BFS通过FIFO队列实现节点遍历,保证在无权图中的最优性。文章详细解析了BFS的伪代码实现和Python编程示例,并通过机器人路径规划案例展示了其实际应用场景。测试结果表明,BFS能有效解决包含障碍物的网格寻路问题,验证了算法在AI领域的实用价值。该研究为理解基础搜索算法及其工程应用提供了重要参考。

梦想起飞的地方 1142

poj2447 RSA公钥加密破译

#include #include #include #include #define MAXN 10 #define C 16381 long long min; long long multi(long long a, long long b, long long n){ long long tmp = a % n, s = 0; while(b){ if(b & 1) s = (s

执米之手,与米偕老 893

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

POJ 2447 RSA 大数分解+逆元+快速幂

链接:http://poj.org/problem?id=2447 题意: 思路:Pollard_Rho质数分解,得到两个素数因子,P,Q,求出T,E,快速幂即可得M。 代码:#include #include #include #include #include #include #include #include #include #include #includ

看曙光 1512

最新的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公钥密码体制+PollarRho大整数的因数分解)

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 every...

codeswarrior的博客 906

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

poj 2447解题报告

题目来源:http://poj.org/problem?id=2447 题目大意: 破解RSA。RSA是什么?这个世界有一种东西叫google,他的妻子是百度。。。 题目分析: 这是一道数论的综合题!经典! 用很多数论知识。其实如果有板子的话就是几句话的事。。。具体解法如下: 1.首先用miller-rabin,pollard_rho做大整数的质因数分解,得到两个素数P,Q,polla

Taylor Wu的专栏 923

POJ 2447

挺水的一题。其实只要理解了RSA算法,就知道要使用大整数分解的方法来直接模拟了。 不过,要注意两个INT64的数相乘来超范围 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <stdlib.h> ...

weixin_30784945的博客 133

poj2447

题意:两个素数P,Q。N=P*Q; T=(P-1)*(Q-1); (E*D)mod T = 1; (0&lt;=D&lt;T)。E与T互质,公钥是{E,N},私钥是{D,N}。原始信息M的加密过程为C=(M^E)mod N; 解密过程为 M=(C^D)mod N;("^"表示幂) 现在给出C,E,N(&lt;2^62)。求M。 分析:先通过N分解求P,Q(pollard-rho+Miller-r...

weixin_33770878的博客 154
上一篇: [ZOJ1462][POJ1112] Team Them Up!
下一篇: [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数、递推)
program_shun
博客等级 码龄17年 10粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值