持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
大家国庆节快乐吖。
[AFCTF2018]可怜的RSA
下载后得到两个文件,先在public.key中获取n,en,e的值
from Crypto.PublicKey import RSA
f = open('D:\XINO\public.key', 'rb').read()
pub = RSA.importKey(f)
n = pub.n
e = pub.e
print(n, '\n', e)
# n = 79832181757332818552764610761349592984614744432279135328398999801627880283610900361281249973175805069916210179560506497075132524902086881120372213626641879468491936860976686933630869673826972619938321951599146744807653301076026577949579618331502776303983485566046485431039541708467141408260220098592761245010678592347501894176269580510459729633673468068467144199744563731826362102608811033400887813754780282628099443490170016087838606998017490456601315802448567772411623826281747245660954245413781519794295336197555688543537992197142258053220453757666537840276416475602759374950715283890232230741542737319569819793988431443
# e = 65537
得到n,用yafu去分解:
p = 3133337
q = 25478326064937419292200172136399497719081842914528228316455906211693118321971399936004729134841162974144246271486439695786036588117424611881955950996219646807378822278285638261582099108339438949573034101215141156156408742843820048066830863814362379885720395082318462850002901605689761876319151147352730090957556940842144299887394678743607766937828094478336401159449035878306853716216548374273462386508307367713112073004011383418967894930554067582453248981022011922883374442736848045920676341361871231787163441467533076890081721882179369168787287724769642665399992556052144845878600126283968890273067575342061776244939
现在我们根据已有条件,可以推导出d了。
d = int(invert(e, (p-1)*(q-1)))
之后需要打包去解flag,不太清楚为啥要这么做,贴个脚本吧。
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from base64 import b64decode
key_info = RSA.construct((n, e, d, p, q))
key = RSA.importKey(key_info.exportKey())
key = PKCS1_OAEP.new(key)
f = open('D:\XINO\flag.enc', 'r').read()
c = b64decode(f)
flag = key.decrypt(c)
print(flag)
得到flag
flag{R54_|5_$0_B0rin9}
[AFCTF2018]你能看出这是什么加密么
下载源码,发现p,q,e,c都知道,那我们可以直接求解了啊
import gmpy2
import time
import sympy
from functools import reduce
from Crypto.Util.number import long_to_bytes
p=0x928fb6aa9d813b6c3270131818a7c54edb18e3806942b88670106c1821e0326364194a8c49392849432b37632f0abe3f3c52e909b939c91c50e41a7b8cd00c67d6743b4f
q=0xec301417ccdffa679a8dcc4027dd0d75baf9d441625ed8930472165717f4732884c33f25d4ee6a6c9ae6c44aedad039b0b72cf42cab7f80d32b74061
e=0x10001
c=0x70c9133e1647e95c3cb99bd998a9028b5bf492929725a9e8e6d2e277fa0f37205580b196e5f121a2e83bc80a8204c99f5036a07c8cf6f96c420369b4161d2654a7eccbdaf583204b645e137b3bd15c5ce865298416fd5831cba0d947113ed5be5426b708b89451934d11f9aed9085b48b729449e461ff0863552149b965e22b6
n=p*q
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))
[WUSTCTF2020]情书
下载附件得到下面内容:
Premise: Enumerate the alphabet by 0、1、2、..... 、25
Using the RSA system
Encryption:0156 0821 1616 0041 0140 2130 1616 0793
Public Key:2537 and 13
Private Key:2537 and 937
根据题目内容,得到以下元素:
n = 2537
e = 13
d = 937
很明显是一个RSA加密,我们按常规先分解n:
p = 43
q = 59
题目有个提示,要我们根据数字1-25来进行枚举字母表,我们就可以依据此要求来写一个枚举脚本:
a = "abcdefghijklmnopqrstuvwxyz"
c = "0156 0821 1616 0041 0140 2130 1616 0793".split(" ")
n = 2537
p = 43
q = 59
e = 13
d = 937
phi_n = (p-1)*(q-1)
flag = "".join(a[pow(int(i),d,N)] for i in c)
print ("flag{"+flag+"}")
就可以枚举出flag:
flag{iloveyou}
[AFCTF2018]BASE
下载附件,发现一个大量的文本文件,特征是只有0-9,A-Z,我们尝试一下是不是16进制文本,
解压后发现是一个base64字符串,解码后还有=号,继续以base32解码,然后以base16解码,得到flag.
flag{U_5h0u1d_Us3_T00l5}
不用手动解也是可以的,而且用工具会解的更快一些。
[NPUCTF2020]Classical Cipher
下载后得到一个压缩包和一段文字:
解密后的flag请用flag{}包裹
压缩包密码:gsv_pvb_rh_zgyzhs
对应明文: ***_key_**_******
压缩包密码不对,明显要我们去解开它,尝试用词频分析时得到正确得密码:
the_key_is_atbash
得到压缩包文件
应该是一个猪圈密码加上动物密码,在网上搜索对应图像解出来就行:
flag{classicalcode}
国庆节就摸鱼一天了,准备学学docker写一篇详细的文章作为笔记。