CTF ——crypto ——RSA原理及各种题型总结

CTF之密码学(RSA加密) RSA加密算法由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同发明,并因此得名。它是第一个既能用于数据加密也能用于数字签名的算法。RSA的安全性基于数论中的大数分解难题,即给定一个大整数,很难在合理的时间内将其分解为两个质因数的乘积。 阅读详情

RSA原理及各种题型总结

Table of Contents

一,原理:

信息传递的过程:

rsa加密的过程:

二,CTF 中的 常见的十种类型:

1,已知 p ,q,e   求 d?

2,已知 n(比较小),e  求 d?

3,已知 公钥(n, e) 和 密文 c  求 明文 m?

4,已知密文文件 flag.enc  / cipher.bin /flag.b64和 公钥文件 pubkey.pem /key.pem /key.pub求解明文 m?

5,有私钥 private.pem 和密文 flag.enc 

6,已知c ,e,n(非常大),和 dp,dq,求解明文m

7,已知n(非常大),e,d求p,q(无法直接 从n分解)

8,提取私钥中的信息

9,利用公钥pub.key/pub.pem文件生成 私钥文件

10,n分解出多个不同的因子时  ,求明文m

三,爆破攻击方法:

1,低加密指数分解攻击(比如 e=2,e=3)

2.Roll按行加密(加密是按行进行的)

3.模不互素(存在两个或更多模数 n 且N1和N2不互质)

4.共模攻击(m,n相同;e,c不同,且e1 和 e2互质)

5.低解密指数攻击(e过大或过小,一般e过大时使用)

6,低加密指数广播攻击(模数n、密文c不同,明文m、加密指数e相同)


写在最前面

(文章中的所有python脚本,都是我在python3.7 / python2.7跑过,输出正常的脚本,如果你跑不出来,极可能是你环境的问题)

(文章中的每一个例题,虽是收集来的,但都动手操作过,实际求解出flag 后 再挂出来的)

要求的库包括但不限于:gmpy2、pycryptodome、libnum

gmpy2:https://pan.baidu.com/s/1De5h6XmkAuop69aYDiQ2gg 提取码: 6y2t 

安装命令: pip3 install gmpy2-2.0.8-cp37-cp37m-win_amd64.whl

pycryptodome:  pip3 install pycryptodome

libnum: pip3 install libnum

一,原理:

信息传递的过程:

  • A 要 向 B 传递信息 m

  • 首先 B  要把  公钥 (n, e)传递给  A

  • 然后  A 拿着公钥  进行 公钥加密算法  将 明文 m  变成 密文 c

  • 接着  A 把 生成的 密文 c  传递 给 B

  • 最后  B 再利用 私钥 (n,d)进行 私钥解密算法 还原出来  明文 m

rsa加密的过程:

  • 随便找出两个 整数 q 和 p (q,p互素,即:公因数只有1)
  • 求出n = q * p  
  • φ(n)= (p-1)*(q-1) 欧拉公式
  • 公钥 e :   随机取,要求 :e 和 φ(n) 互素(公因数只有 1);   1<  e < φ(n));
  • 私钥 d :  ed  ≡  1 (mod  φ(n) )   (ed 除以 φ(n) 的 余数 为  1 )

加密算法:

解密算法:

还有一点必须要了解,就是 签名消息 其实就是一个校验码,确保密文在传播过程中没有被篡改过

签名消息(攻防世界中的一个题涉及到这个知识,所以在这里提一下)

RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。

 

二,CTF 中的 常见的十种类型:

1,已知 p ,q,e   求 d?

(ed 除以 (q-1)(p-1) 的 余数 为 1 )

import gmpy2
p = 38456719616722997
q = 44106885765559411
e = 65537

s = (p-1)*(q-1)
d = gmpy2.invert(e,s)
print ("dec: " + str(d))
print ("hex: " +  hex(d))

2,已知 n(比较小),e  求 d?

(n = q * p , ed 除以 (q-1)(p-1) 的 余数 为 1 )(n往往是一个 1024bit 的超大数,很难分解为两个 质数)

n的分解 用yafu 中的 factor(n )命令 (yafu kali自带,也有win版)

3,已知 公钥(n, e) 和 密文 c  求 明文 m?

方法一:(n,e不太大的情况下)

首先将  n 用 yafu分解为 q 和 p

再利用脚本 :

import libnum
from Crypto.Util.number import long_to_bytes

c = 0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86
n = 108539847268573990275234024354672437246525085076605516960320005722741589898641
#n = int("",16)
e = 65537
#e = int("",16)
q = 333360321402603178263879595968004169219
p = 325593180411801742356727264127253758939

d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n)   # m 的十进制形式
string = long_to_bytes(m)  # m明文
print(string)  # 结果为 b‘ m ’ 的形式

方法二:(n , e 比较大的时候)

直接利用 RsaCtfTool进行爆破:

利用 n,e生成公钥文件 test.pem:

python RsaCtfTool.py --createpub --n 46065781....  --e 3546111...  > test.pub

再利用 下面的 使用 公钥爆破

 

4,已知密文文件 flag.enc  / cipher.bin /flag.b64和 公钥文件 pubkey.pem /key.pem /key.pub求解明文 m?

方法一:(key.pem 和 cipher.bin)

直接用 RsaCtfTool进行破解:

python RsaCtfTool.py --publickey key.pem --uncipherfile cipher.bin

 

方法二:(flag.b64 和 key.pub)

先处理flag.b64(将flag.b64中的内容进行解 base64操作)

使用 notepad++ 打开 flag.b64文件使用 插件中的 MIME Tools 中的 base64 decode 将文件内容解密,然后另保存为 flag.enc 文件

然后使用 RsaCtfTool 工具进行破解:

python RsaCtfTool.py --publickey /root/desktop/share/key.pem --uncipherfile /root/desktop/share/flag.enc

 

方法三:

首先,提取 pubkey.pem 中的 参数:(openssl linux自带,win下也可以安装,具体openssl的用法自行百度)

一般能提取出来 n的值

openssl rsa -pubin -text -modulus -in warmup -in pubkey.pem

其次,用 yafu 分解 n 得到 q,p  (win环境下)

yafu.exe factor(461616564564564654151561313213214659789765613131)

然后 制作 私钥 :生成私钥文件  private.pem

python rsatool.py -o private.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239

最后 用private.pem文件 解密 flag.enc文件

openssl rsautl -decrypt -in flag.enc -inkey private.pem

 

5,有私钥 private.pem 和密文 flag.enc 

方法一:利用 rsactftool。

python RsaCtfTool.py --private private.pem  --uncipherfile flag.enc

方法二:利用 openssl:

openssl rsautl -decrypt -in flag.enc -inkey private.pem

6,已知c ,e,n(非常大),和 dp,dq,求解明文m

领航杯2019的一道题,EasyRSA:给了e,  n,  c,由于特别大,没法直接用质因数分解求得 q, p

还给了  phint  =  d  % (p - 1)       其实 phint  = dp

            qhint   =  q   % (p - 1)       其实 qhint  = dq

(2019山东省赛“深思杯”中 被加密的消息 一题  跟本题 的思路一样)

import gmpy2
import libnum
e=65537
n=16969752165509132627630266968748854330340701692125427619559836488350298234735571480353078614975580378467355952333755313935516513773552163392952656321490268452556604858966899956242107008410558657924344295651939297328007932245741660910510032969527598266270511004857674534802203387399678231880894252328431133224653544948661283777645985028207609526654816645155558915197745062569124587412378716049814040670665079480055644873470756602993387261939566958806296599782943460141582045150971031211218617091283284118573714029266331227327398724265170352646794068702789645980810005549376399535110820052472419846801809110186557162127
dp=17816257752910288702696852575211080903295430127287054677825469139515376426236217692464411221899486713749909464051644598674106468255913106226183791162842937940909702921652633347493930099993354130899037966243261680396182870781926464
buu [GUET-CTF2019]BabyRSA 查看题目 观察题目给的条件,给了p+q,(p+1)(q+1),e,d,以及密文C. RSA的解密公式:M=C^d mod n 所以我们只要求出n即可。(n = pq) n = (p+1)(q+1) - (p+q) - 1 求M的值,已知C,d,n后 用函数pow(),即可求出 import libnum a = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30 阅读详情

相关推荐

CTF 2 Cipher.enc

由于给定字符串"10107E0AE50ECB0000010107E0C0FFEE"是32位长度的十六进制数,转换为二进制后是128位长度,因为AES密钥通常是128位、192位或256位,首先尝试AES解密。由于此处并未给出IV/Counter等信息,先尝试使用ECB。首先查看文件内容,cat cipher.enc。发现乱码不能正常显示,尝试使用二进制。

Stay hungry, stay foolish. 783

CTF RSA入门:5大常见题型解析与Python实战代码

RSA作为一种非对称加密算法,其安全性基于大整数分解的数学难题,是现代密码学与网络安全领域的基石。其核心原理是利用一对公钥和私钥,通过模幂运算实现加密与解密。在工程实践中,RSA被广泛应用于数字签名、密钥交换和安全通信等场景。然而,在CTF竞赛中,题目往往通过引入非标准实现或信息泄漏来考察对算法原理的理解。例如,当模数n可被分解时,私钥即可被恢复;当相同的明文使用相同模数但不同公钥指数加密时,可利用共模攻击直接恢复明文。本文聚焦于CTF中的RSA挑战,系统拆解了模数分解、共模攻击、低加密指数攻击、维纳攻击及

weixin_42525738的博客 275

CTF实战:从ZIP伪加密到RSA破解的完整解题流程

在信息安全领域,文件格式分析与密码学是两项基础且关键的技术。文件格式分析涉及对ZIP、PNG等常见文件结构的解析,其核心原理在于理解文件头、数据区等组成部分的规范。这项技术的价值在于能够发现隐藏信息、修复损坏文件或识别伪加密等安全机制绕过。密码学则围绕加密算法(如RSA)的数学原理展开,通过公钥、私钥与模数运算实现数据保护。在实际的CTF竞赛与安全评估中,这两项技术常结合使用,形成从信息收集到最终解密的完整攻击链。例如,通过分析ZIP文件的十六进制结构,可以识别并手动修复伪加密标记,从而提取出被保护的RSA

weixin_33831673的博客 432

人工势场法三大致命缺陷?我用ROS+Gazebo做了组对比实验

本文通过ROS与Gazebo仿真实验,深入剖析了人工势场法(APF)在机器人路径规划中的三大经典问题:局部最小值、目标不可达和路径震荡。文章不仅复现了这些缺陷,还对比测试了虚拟目标点法、改进斥力场及运动平滑等主流改进方案,为工程选型提供了基于数据的实用建议。

dapp9builder的博客 213

深入解析SOC芯片设计中DFT OCC与ATPG的协同优化策略

本文深入探讨了在复杂SOC芯片设计中,DFT(可测试性设计)的核心组件OCC(片上时钟控制器)与ATPG(自动测试向量生成)的协同优化策略。文章从基本原理出发,分析了OCC作为测试时钟管理者的关键作用,以及ATPG作为故障检测引擎的工作机制,并重点阐述了二者在测试架构选择、参数对齐、低功耗测试等场景下的协同方法与实战技巧,旨在实现更高的测试覆盖率与更低的测试成本。

efc123456的博客 1027

MyEclipse 2017 CI 10安装与激活

本文介绍MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的安装与激活。此方法理论上应该能激活MyEclipse 2017 CI所有系列,即激活方法是通用的,只是激活文件略有不同。本文提供MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的激活文件。说明:博主所提供的压缩包格式均为RAR5,即WinRAR 5.0以上的版本才能正常解压,别的压缩软件博主不太清...

weixin_42539046的博客 9408

Polars简明基础教程一:Polars快速入门

在这个例子中,我们将添加一个列,其中包含每个舱位中乘客的最大年龄。在Python中(而不是特指Polars),当我们将代码包裹在括号中时,我们可以在新行上调用一个新方法——在这种情况下是select。在这里,我们看到一个使用表达式API的简单示例,其中我们在select语句中选择Pclass、Name和Age列(我们将在第3节中深入了解select语句)。表达式是一个函数,它接受一个Series(或DataFrame中的列)作为输入,并返回一个Series(或DataFrame中的列)。

sosogod的博客 3865

【Android面试八股文】Handler如果没有消息处理是阻塞的还是非阻塞的?Looper 为什么要使用死循环?Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

Handler如果没有消息处理是阻塞的还是非阻塞的? Looper 为什么要使用死循环? Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

字节卷动 752

OWASP-ZAP扫描器的使用

目录 OWASP-ZAP 更新 代理 目录扫描 主动扫描(Active Scan) 扫描结果 生成报告 OWASP-ZAP OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者积极维护。它可以帮助你在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。 也可以说ZAP是一个中间人代理。它能够获取你对Web应用程序发出的所有请求以...

谢公子的博客 2万+

一文搞定 ST22 短转储 MEMORY_NO_MORE_PAGING:看懂 SAP Paging 机制,参数 rdisp/PG_SHM 与 rdisp/PG_MAXFS 怎么设才稳

SAP系统MEMORY_NO_MORE_PAGING错误通常源于Paging资源耗尽而非物理内存不足。关键排查点包括:通过ST22确认错误类型,ST02监控Paging使用情况,检查工作进程trace中的"no more free blocks"提示。解决方案建议将rdisp/PG_SHM和rdisp/PG_MAXFS设为相同值(如250000块≈2GB),使Paging完全在内存中运行。同时需优化易耗Paging的代码逻辑,如避免滥用EXTRACT命令和超大内存对象传输。典型案例如月末

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 317

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。 网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。 本文整理的多数文章都是有对应的系列性文章专栏,可以更方便的进行系统学习相关知识体系。

努力前行,总会成为自己心中的那道光 15万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: SDUT-SQL题解
下一篇: CTF——MISC——流量分析
Captain Hammer
博客等级 码龄8年 428粉丝 46原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值