BUUCTF密码进阶-DAY3

379 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

ctf1.PNG

下载附件,发现一个大量的文本文件,特征是只有0-9,A-Z,我们尝试一下是不是16进制文本,

解压后发现是一个base64字符串,解码后还有=号,继续以base32解码,然后以base16解码,得到flag.

flag{U_5h0u1d_Us3_T00l5}

不用手动解也是可以的,而且用工具会解的更快一些。

[NPUCTF2020]Classical Cipher

下载后得到一个压缩包和一段文字:

解密后的flag请用flag{}包裹
压缩包密码:gsv_pvb_rh_zgyzhs
对应明文:   ***_key_**_******

压缩包密码不对,明显要我们去解开它,尝试用词频分析时得到正确得密码:

quipqiup.com/

the_key_is_atbash

得到压缩包文件

ctf2.PNG 应该是一个猪圈密码加上动物密码,在网上搜索对应图像解出来就行:

flag{classicalcode}

国庆节就摸鱼一天了,准备学学docker写一篇详细的文章作为笔记。