摘要
本文记录了作者在BUUCTF刷题中(Crypto部分)的收获。
暂停更新,近期考研,有缘继续。
关键词:CTF;Crypto;
Day1
[BJDCTF 2nd]签到-y1ng
Base64解码即可
password
社工题?脑洞题?不看wp真的一头雾水。
flag为名字首字母缩写加生日。
zip伪加密
有一说一,这不是misc题吗?
打开winhex把 09 00
改为 00 00
即可
Rabbit
找个在线Rabbit解密网站解密即可。
MagicianV
维吉尼亚加密,本来应该做词频分析的,不过有一个好用的轮子,vigenere-solver,直接就出明文了:
1 | …… |
拉到最后发现flag,但是不知道为何始终无法提交。
篱笆墙的影子
栅栏密码,每组字数13,找个在线网站就解决了。
丢失的MD5
大概是想考察MD5?脚本可以直接跑,感觉是个介绍的送分题
Alice与Bob
RSA基础大数分解,上http://factordb.com查一下就出结果,完事后MD5加密提交。
[BJDCTF 2nd]老文盲了
脑洞题,有点意思,找到汉字转拼音网站:
1 | 罼雧締眔擴灝淛匶襫黼瀬鎶軄鶛驕鳓哵眔鞹鰝 |
读一遍就明白意思了。
所以flag{淛匶襫黼瀬鎶軄鶛驕鳓哵}
rsarsa
rsa已知p, q, e, c, 先求d后解密。
脚本解决就完事
1 | import gmpy2 |
Windows系统密码
hash解密即可,Kali的John工具就行。
1 | john pass.hash |
传统知识+古典密码
1 | 辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳 +甲子 |
然后凯撒或者栅栏跑,跑出有意义的字符串SHUANGYU。
属实无聊,脑洞题。
[BJDCTF 2nd]cat_flag
将猫转换为对应的二进制,猜测为ASCII码,转换成字符串即可。这有两种可能,取有意义的字符串 M!a0~
大帝的密码武器
凯撒密码,在线加解密跑一次即可
[BJDCTF 2nd]燕言燕语-y1ng
1 | 79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20 |
十六进制转换,得到字符串,传统解密挨个跑,发现是维吉尼亚解密,得到flag。
Day2
RSA1
已知dp, dq求解,上脚本跑就行了。
1 | import gmpy2 |
[BJDCTF 2nd]灵能精通-y1ng
图片搜索,然后发现是圣堂武士密码,对照图片求解即可。
[MRCTF2020]天干地支+甲子
老题目了,跟传统知识+古典密码题目一模一样。
天干地支转换为数字+60(甲子),即可得到ASCII码,转换即为Flag。
[MRCTF2020]keyboard
电话密码,对照手机键盘转换即可。
信息化时代的步伐
中文电码解密,这个还没怎么见过,有点意思。
凯撒?替换?呵呵!
工具跑倒是能跑出来,不过用工具比较坑的一点是,我最初以为空格是替换出来的,但是后来提交不对发现,应该是quipquip自己加的方便分析,去掉空格即可。
old-fashion
quipquip词频分析直接就出来了。
[BJDCTF 2nd]Y1nglish-y1ng
MIH=BJD, quipquip继续词频分析,修正一下错误的单词即可。
RSA3
RSA共模攻击,上脚本即可:
1 | from gmpy2 import * |
权限获得第一步
hash加密,上cmd5上查一下即可。
萌萌哒的八戒
猪圈密码,参照下面密码图破解即可。
RSA2
已知e, n, dp, c, 破解RSA。上脚本即可。
1 | import gmpy2 |
世上无难事
词频分析,上quipquip分析即可。
robomunication
将mp3中的b和p记录下来:
1 | bbbb b bpbb bpbb ppp bpp bbbb bp p bb bbb p bbbb b pbp b pbpp bb p bb bbb pbbb ppp ppp bppb pbbb b b bppb |
莫斯电码转换即可。
异性相吸
异或加密处理了而已,再异或处理一次即可。
RSA
给了公钥和密文,解密即可…………
还原大师
hash爆破,下面是脚本:
1 | import hashlib |
[AFCTF2018]Morse
莫斯电码,在线解密后hex转str得到flag。
[NCTF2019]Keyboard
键盘密码的变种,先是26键,部分手机有对应数字,然后转换为九键,即是常规的手机键盘密码了。
Day3
传感器
曼切斯特编码和差分曼切斯特编码,题目有点意思,抽个时间专门总结一下:
1 | cipher='5555555595555A65556AA696AA6666666955' |
RSAROLL
1 | import gmpy2 |
Cipher
本来我是一头雾水,然后搜索了一下wp发现居然关键点在于”公平”——Playfair密码。
而密钥就是playfair, 通过在线链接可以直接跑出来。
[BJDCTF 2nd]rsa0
脚本如下:
1 | from pwn import * |
rsa2
e可分解,e很大,低解密指数攻击,github有攻击代码:
利用脚本如下:
1 | import hashlib |
dangerous RSA
e=3, 直接上脚本即可:
1 | from gmpy2 import iroot |
达芬奇密码
斐波拉契数列乱序,这是我根本没想到的。搜了WP才知道,求出密文对应的正确映射次序即为flag。以下是网上找的脚本:
1 | a=[0,233,3,2584,1346269,144,5,196418,21,1597,610,377,10946,89,514229,987,8,55,6765,2178309,121393,317811,46368,4181,1,832040,2,28657,75025,34,13,17711] |
Day4
rot
rot-n 加密,脚本如下,大概猜到是rot-13, 但是字符串始终不对:
1 | import re |
密码学的心声
埃塞克码 = ASCII码,真是反应半天。
八进制,所以按三个数字分隔。
1 | s = '111 114 157 166 145 123 145 143 165 162 151 164 171 126 145 162 171 115 165 143 150' |
这是什么
FileAnalysis跑一波,发现是doc文件,打开发现是JSfuck,复制到Chrome里的consle直接运行即可。
Unencode
UUencode,在线网址UUencode
Uuencode是二进制信息和文字信息之间的转换编码,也就是机器和人眼识读的转换。Uuencode编码方案常见于电子邮件信息的传输,目前已被多用途互联网邮件扩展(MIME)大量取代。
Uuencode将输入文字以每三个字节为单位进行编码,如此重复进行。如果最后剩下的文字少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。
Uuencode编码每60个将输出为独立的一行(相当于45个输入字节),每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是“M”这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。
[BJDCTF 2nd]rsa1
上脚本:
1 | from pwn import * |
[GXYCTF2019]CheckIn
打开发现是b64解码,解出来一团乱码,最后发现是rot-n加密,在线网站解之 ROT 5/13/18/47
当然最好还是自己手搓脚本
1 | chiper="v)*L*_F0<}@H0>F49023@FE0#@EN" |
RSA5
多组n和c,上脚本吧
1 | import gmpy2 |
[HDCTF2019]basic rsa
改改给的脚本就能跑出答案了。
1 | import gmpy2 |
一张谍报
真的很有意思,不认真分析一头雾水,抄的网上师傅的脚本
1 | #-*-coding=utf-8-*- |
再加上题目暗示,三楼能源楼管老王,所以Flag为 flag{南天菩萨放鹰捉猴头}
[HDCTF2019]bbbbbbrsa
借鉴了一位师傅的思路,特别有意思:
1 | import gmpy2 |
救世捷径
所以,算法题也算密码学?
有向图最短路问题,根据各向量的权值,使用Dijkstra算法求出最短路径,然后对照字符串得到flag。
1 | import networkx as nx |
SameMod
RSA共模攻击, 找的攻击脚本:
1 | import gmpy2 as gp |
[GUET-CTF2019]BabyRSA
上脚本:
1 | import gmpy2 |
yxx
记事本打开密文是乱码,hex打开,然后估计就是异或加密,跟之前的异性相吸那道题解法相似:
1 | h=['0A','03','17','02','56','01','15','11','0A','14','0E','0A','1E','30','0E','0A','1E','30','0E','0A','1E','30','14','0C','19','0D','1F','10','0E','06','03','18'] |
浪里淘沙
词频分析,只是这个根据排序确定flag我是没想到。
[BJDCTF2020]signin
十六进制转字符串。
[BJDCTF2020]这是base??
看了看,字典都给了,直接跑就完事。
1 | import base64 |
鸡藕椒盐味
是我孤陋寡闻,“鸡藕椒盐味”=“奇偶校验位”
由Richard Hamming于1950年提出、还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠错。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
所以代码更正为 110110100000
[NCTF2019]childRSA
关键点在于 sieve_base
,而这是前10000个素数的生成列表,我们再去查一下第10000个素数的值为104729。
脚本如下:
1 | from Crypto.Util.number import sieve_base as primes |
[BJDCTF2020]rsa_output
又是共模攻击,直接上官方的脚本算了:
1 | from Crypto.Util.number import long_to_bytes |
[MRCTF2020]古典密码知多少
古典密码集合,考察了,标准银河字母+圣堂武士+猪圈变形
[AFCTF2018]你能看出这是什么加密么
老熟人RSA了。
1 | import gmpy2 |
Day5
[GWCTF 2019]BabyRSA
拿到脚本分析,已知N和m1、m2。因为p、q为相邻的素数,所以可以通过开方N求出q,继而求出p。
其中:
求解方程组即可得到flag。
脚本如下:
1 | import gmpy2 |
坏蛋是雷宾
Rabin加密,一种基于模平方和模平方根的非对称加密算法。
解题脚本如下:
1 | #-*-coding=utf-8-*- |
[BJDCTF2020]easyrsa
题目给了c, z, n, 其中:
化简可得:
所以脚本如下:
1 | # -*- coding:utf-8 -*- |
[BJDCTF2020]RSA
给了c,n,以及三次加密的结果,可以通过爆破逆向求解e,进而求出p和q。脚本如下:
1 | import gmpy2 |
[WUSTCTF2020]佛说:只能四天
根据提示,使用新约佛论禅、核心价值观、栅栏解密、凯撒解密、b32解密,最后跑出flag。
[HDCTF2019]together
RSA共模攻击
1 | # python3 |
EasyProgram
流程很简单,跟着程序逻辑逆推即可。C语言脚本:
1 |
|
[RoarCTF2019]babyRSA
因为:
所以可以构造脚本:
1 | import sympy |
[NCTF2019]babyRSA
p, q相近,开根号爆破即可:
1 | from Crypto.Util.number import * |
[MRCTF2020]vigenere
维吉尼亚,在线解密即可。
[AFCTF2018]Vigenère
同样维吉尼亚,在线解密即可。
RSA4
五进制是真的恶心,口区。
已知c,n,先进制转换,低解密指数广播攻击:
1 | import gmpy2 |
[ACTF新生赛2020]crypto-rsa3
p、q相近,开根号即可:
1 | import gmpy2 |
[RoarCTF2019]RSA
已知A,n,c,并且:
n可以分解,上factordb.com直接跑出来,当然这是非预期解。预期解如下:
设:
所以可得:
再回头来推导$p$和$q$:
所以得到:
脚本爆破恢复$q$:
1 | import gmpy2 |
[ACTF新生赛2020]crypto-rsa0
伪加密,把文件拿出来跑一下解密即可。
1 | from Cryptodome.Util.number import * |
Day6
RSA & what
RSA共模攻击:
1 | import gmpy2 |
b64解码结果:
1 | THIS FLAG IS HIDDEN. CAN YOU FIND IT OUT? DO YOU KNOW BASE64? YoungC THINK YOU ARE NOT THAT FAMILIAR WITH BASE64. Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. The term Base64 originates from a specific MIME content transfer encoding. The particular set of 64 characters chosen to represent the 64 place-values for the base varies between implementations. The general strategy is to choose 64 characters that are both members of a subset common to most encodings, and also printable. This combination leaves the data unlikely to be modified in transit through information systems, such as E-mail, that were traditionally not 8-bit clean.[1] For example, MIME's Base64 implementation uses A�CZ, a�Cz, and 0�C9 for the first 62 val ues. Other variations share this property but differ in the symbols chosen for the last two values; an example is UTF-7. |
所以flag在哪?我一脸蒙蔽。
[V&N2020 公开赛]CRT
CRT的递归求解,有点意思,可以看看这篇WP:Writeup for V&N 2020 公开赛
文章讲得很清楚了,我就不再赘述,顺带借用一下脚本(懒得自己手搓了):
1 | import hashlib |
[BJDCTF2020]Polybius
hint解码为:The length of this plaintext: 14
棋盘密码,关键点在于要猜到key为aeiou
用的wp的轮子,就不自己手搓了2333:
1 | import itertools |
[AFCTF2018]Single
凯撒加密,quipquip直接跑就完事了。
Day 7
[ACTF新生赛2020]crypto-classic0
压缩包密码暴力跑生日是真的没想到,我果然还是misc做少了。
1 | cipher = 'Ygvdmq[lYate[elghqvakl}' |
[BJDCTF2020]编码与调制
啊,又是曼切斯特编码,不过相对上面那道题出得比较简单,脚本如下:
1 | msg=0x2559659965656a9a65656996696965a6695669a9695a699569666a5a6a6569666a59695a69aa696569666aa6 |
[WUSTCTF2020]babyrsa
给了c,n,e,上factordb一查发现n可分解,那就直接上脚本了:
1 | import gmpy2 |
[ACTF新生赛2020]crypto-classic1
键盘密码和维吉尼亚密码。
但是这键盘……谁TM猜得出来啊,画圈=circle
?
还不如工具直接暴力跑。
[AFCTF2018]BASE
暴力跑base三种常规类型的破解就行了。
1 | import base64 |
[WUSTCTF2020]大数计算
额,这就是简单编程题目吧……上脚本:
1 | # p1=1 |
[WUSTCTF2020]B@se
密码表差了4个字符,暴力跑一下就行了。脚本如下:
1 | class base64: |
然后从结果中筛选出WUSTCTF2020的flag即可。