攻防世界 crypto 入门题之easy_RSA

51 篇文章 8 订阅

攻防世界 crypto 入门题之easy_RSA

继续开启全栈梦想之逆向之旅~
这题是攻防世界crypto 入门题之easy_RSA
在这里插入图片描述RSA的密码学听说了好久,主要是战队的队友之前有研究,而我却是一点都不了解,这次遇到了,就研究一下做题方法和技巧,密码学目前是不打算深究了,毕竟数学也不太好,所以我现在的目的就是懂得用对应的脚本来解这类RSA题。
附件下下来后就两行字:
在这里插入图片描述看着都不难,但说实话我连RSA是什么都不知道,查了下百度,根据百度百科的说法:

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 [2] 。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK [2] 。
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥 [4] 。

在这里插入图片描述在这里插入图片描述
不知道你看不看得懂,反正我是大概看懂了,d通常是我们要求的。接下来就是重头戏了,RSA的脚本工具,查看官方admin的WP:
在这里插入图片描述锁定了我要找的工具:

https://github.com/3summer/CTF-RSA-tool

在这里插入图片描述

kali虚拟机中直接git clone下载
在这里插入图片描述在这里插入图片描述
这是python2编写的,2018年的脚本,按照要求搞好配置后开始研究这脚本在RSA中的利用,希望能解答大多数RSA题目:(PS:这里不得不吐槽一下,这个脚本工具里的sagemath配置搞了我将近一整天,最后还是搞不出来,其实安转好了,就是那个from sage.all_cmdline import *老是报错说没有sage.all_cmdline这个模块,百度等浏览器上的资料又少,没办法,只能放弃了)

首先看该脚本工具README.md中的说明了解一些参数的用法和大概控制流程(中英注释都写在那里了):

usage: solve.py [-h]	
用法:solve.py[-h] (--decrypt DECRYPT | -c DECRYPT_INT | --private | -i INPUT | -g) 
[--createpub] [-o OUTPUT] [--dumpkey] [--enc2dec ENC2DEC] [-k KEY] [-N N] [-e E] [-d D] [-p P] [-q Q] [--KHBFA KHBFA][--pbits PBITS] 
[-v]
It helps CTFer to get first blood of RSA-base CTF problems  它有助于CTFer获得RSA基础CTF问题的第一滴血
-v, --verbose         print details		详细的打印细节

optional arguments:可选参数(注意!!!这里之间只可选一个):
-h, --help            show this help message and exit		--帮助显示此帮助消息并退出

--decrypt DECRYPT     decrypt a file, usually like "flag.enc"	解密文件,通常类似于“flag.enc”
(通常搭配k的.pem或.pub一起使用)

-c DECRYPT_INT,
--decrypt_int DECRYPT_INT		解密长整形数

--private             Print private key if recovered	打印私钥(如果已解密)

-i INPUT		input a file with all necessary parameters (see examples/input_example.txt)
输入包含所有必要参数的文件(请参见示例/输入(示例.txt)

-g, --gadget          Use some gadgets to pre-process your data first	使用一些小工具先预处理数据

some gadgets:一些小工具预处理数据:

--createpub           Take N and e and output to file specified by "-o" or just print it
获取N和e并输出到由“-o”指定的文件或者直接打印出来就行了

-o OUTPUT, --output OUTPUT		输出		Specify the output file path in --createpub mode.
在--createpub模式下指定输出文件路径。

--dumpkey             Just print the RSA variables from a key - n,e,d,p,q
只打印一个key-n、e、d、p、q中的RSA变量

--enc2dec ENC2DEC     get cipher (in decimalism) from a encrypted file
从加密文件中获取密码(十进制)

the RSA variables:RSA变量:Specify the variables whatever you got指定您得到的变量

-k KEY,   pem file, usually like ".pub" or ".pem", and it begins with "-----BEGIN"
pem文件,通常类似于“.pub”或“.pem”,并以“-----BEGIN”开始

-N N                  the modulus	模量

-e E                  the public exponent	公共指数

-d D                  the private exponent	私人指数

-p P                  one factor of modulus	模量的一个因子

-q Q                  one factor of modulus	模量的一个因子

extra variables:额外变量:Used in some special methods 在一些特殊的方法中使用:

--KHBFA KHBFA         use Known High Bits Factor Attack, this specify the High Bits of factor
使用已知的高位因子攻击,这指定因子高位

--pbits PBITS         customize the bits lenth of factor, default is half of n`s bits lenth
自定义因子的位长度,默认值为n's比特长度

下面来看对应的解题例子,首先进入examples文件夹中打开input_example.txt
在这里插入图片描述在这里插入图片描述
按照上面所说,多组n,e,c在解题时长这个样子:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述可以看到特征真的就是多个n,e,c,甚至还有d,且不管这里的n,e,c是大还是小,长还是短,都列入多组n,e,c类型里。

继续看只有一组n,e,c的题目样式:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
从这里可以看到一组,n,e,c里面甚至可以没有c,这里的n,e,c也不管大小,长短,这里最后一个hbop的解题要用到前面说得sagemath,这里暂且不说。

然后我们继续观察该脚本工具文件夹根目录下的example.txt,继续分析利用方式:
在这里插入图片描述下面是该文档的内容:

# 只需要一组密钥的
# wiener_attack 
python2 solve.py --verbose --private -i examples/wiener_attack.txt
# 或者通过命令行,只要指定对应参数就行了
python2 solve.py  --verbose --private -N 460657813884289609896372056585544172485318117026246263899744329237492701820627219556007788200590119136173895989001382151536006853823326382892363143604314518686388786002989248800814861248595075326277099645338694977097459168530898776007293695728101976069423971696524237755227187061418202849911479124793990722597 -e 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619

# factordb.com
python2 solve.py --verbose  -k examples/jarvis_oj_mediumRSA/pubkey.pem --decrypt examples/jarvis_oj_mediumRSA/flag.enc

# Boneh and Durfee attack
# TODO: get an example public key solvable by boneh_durfee but not wiener

# small q attack
python2 solve.py --verbose --private -k examples/small_q.pub

# 2017强网杯线上赛 RSA 费马分解(p&q相近时)
python2 solve.py --verbose --private -i examples/closed_p_q.txt

# Common factor between ciphertext and modulus attack
python2 solve.py --verbose -k examples/common_factor.pub --decrypt examples/common_factor.cipher

# small e
python2 solve.py --verbose -k examples/small_exponent.pub  --decrypt examples/small_exponent.cipher

# rabin method when e == 2
python solve.py --verbose -k examples/jarvis_oj_hardRSA/pubkey.pem --decrypt examples/jarvis_oj_hardRSA/flag.enc

# Small fractions method when p/q is close to a small fraction
python2 solve.py --verbose -k examples/smallfraction.pub  --private

# Known High Bits Factor Attack
python2 solve.py --verbose -i examples/KnownHighBitsFactorAttack.txt


# 需要多组密钥的
# 第三届上海市大学生网络安全大赛--rrrsa d泄漏攻击 
python2 solve.py --verbose -i examples/d_leak.txt

# 模不互素
python2 solve.py --verbose -i examples/share_factor.txt

# 共模攻击
python2 solve.py --verbose -i examples/share_N.txt

# Basic Broadcast Attack
python2 solve.py --verbose -i examples/Basic_Broadcast_Attack.txt

按着顺序来:
1: 只需要一组密钥的
wiener_attack

python2 solve.py --verbose -i examples/wiener_attack.txt

在这里插入图片描述在这里插入图片描述2:或者通过命令行,只要指定对应参数就行了

python2 solve.py  --verbose --private -N 460657813884289609896372056585544172485318117026246263899744329237492701820627219556007788200590119136173895989001382151536006853823326382892363143604314518686388786002989248800814861248595075326277099645338694977097459168530898776007293695728101976069423971696524237755227187061418202849911479124793990722597 -e 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619

在这里插入图片描述3:factordb.com

python2 solve.py --verbose  -k examples/jarvis_oj_mediumRSA/pubkey.pem --decrypt examples/jarvis_oj_mediumRSA/flag.enc

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述4:Boneh and Durfee attack
TODO: get an example public key solvable by boneh_durfee but not wiener

无解

5:small q attack

python2 solve.py --verbose --private -k examples/small_q.pub

在这里插入图片描述在这里插入图片描述6:2017强网杯线上赛 RSA 费马分解(p&q相近时)

python2 solve.py --verbose -i examples/closed_p_q.txt

在这里插入图片描述在这里插入图片描述7:Common factor between ciphertext and modulus attack

python2 solve.py --verbose -k examples/common_factor.pub --decrypt examples/common_factor.cipher

在这里插入图片描述在这里插入图片描述
在这里插入图片描述这里乱码了,后期还要再改源代码,思路是先十六进制输出来。

8:small e

python2 solve.py --verbose -k examples/small_exponent.pub  --decrypt examples/small_exponent.cipher

在这里插入图片描述在这里插入图片描述在这里插入图片描述8:rabin method when e == 2

python2 solve.py --verbose -k examples/jarvis_oj_hardRSA/pubkey.pem --decrypt examples/jarvis_oj_hardRSA/flag.enc

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述9:Small fractions method when p/q is close to a small fraction

python2 solve.py --verbose -k examples/smallfraction.pub  --private

在这里插入图片描述呃,我这里报错了,这需要sage,我说了我搞不定。

10:Known High Bits Factor Attack

python2 solve.py --verbose -i examples/KnownHighBitsFactorAttack.txt

在这里插入图片描述这个带0x的高指数更是需要sage,我也搞不定,复现不了。

11:需要多组密钥的
第三届上海市大学生网络安全大赛–rrrsa d泄漏攻击

python2 solve.py --verbose -i examples/d_leak.txt

在这里插入图片描述在这里插入图片描述
12:模不互素

python2 solve.py --verbose -i examples/share_factor.txt

在这里插入图片描述在这里插入图片描述13:共模攻击

python2 solve.py --verbose -i examples/share_N.txt

在这里插入图片描述在这里插入图片描述14:Basic Broadcast Attack

python2 solve.py --verbose -i examples/Basic_Broadcast_Attack.txt

在这里插入图片描述在这里插入图片描述

到这里我的工作基本就完成了,现在回头看看攻防世界的easy_RSA真的用脚本跑一下就行了,不过学问可当然不是这样做的,但是本人真的对密码学没啥子兴趣,所以只能研究下解题脚本了。

补充:单个n,e,c,q,p,的时候最好用单个参数输入的方式,不要用文本读取的方式,因为文本读取的时候DEBUG显示的十六进制的d有时并不是我们想要的,比如攻防世界这道easy_RSA:
文本输入(N是pq乘积):
在这里插入图片描述而十六进制d:0x1be550de4f93c61L转换十进制出来却多出一个1,(标准答案应该是十进制的125631357777427553
才对)
在这里插入图片描述这里我也搞不懂,还需要深究脚本源码,不过如果直接参数输入就没有这个DEBUG d问题,因为会直接显示出INFO信息,下面两个命令都可用,毕竟N=q*p,只用N也是可以的:

python2 CTF-RSA-tool/solve.py --verbose --private -N 2135733555619387051 -e 17
python2 CTF-RSA-tool/solve.py --verbose --private -N 2135733555619387051 -e 17 -p 473398607161 -q 4511491

结果:
在这里插入图片描述

这篇博客对你有什么用?其实对你没什么用,是写给我自己看的,当然你要是能从中提取到对自己有帮助的信息我也很欣慰。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值