密码学类题目考查各种加解密技术,包括古典密码和现代密码,甚至是出题者自创加密技术。
- 大多数基于现代密码学理论与算法出题
- 需要大量的密码学算法分析和算法积累
- 基本都是在做算法攻击
- 密码学算法误用
- 例如:不正确的使用 RSA 算法可以造成密钥被爆破
- 少量的古典密码或古典密码的变形
- 需要比较厚实的数学(数论)基础
在线编码解码工具合集:https://www.yuque.com/poetdp/wlaq/ttwtfr
编码与解码
ASCII 编码
Hex 编码
编码:逐字符转换为字符ASCII码的十六进制,例如:
hex_encode( flag{123}
) = 666c61677b3132337d
解码:两位一组转换为ASCII码对应字符,例如:
hex_decode( 666c61677b3132337d
) = flag{123}
【例】584734024210391580014049650557280915516226103165
Dec转Hex:666c61677b746869735f69735f615f666c61677d
Hex解码:flag{this_is_a_flag}
URL 编码
URL 编码是对每个字符的 hex 前置一个“%”,主要是为了解决特殊字符在传输过程中造成的问题。
URL 解码只需关注“%”连带的三个字符。
作为完整的网址:除了ASCII字母和数字,以及这些ASCII标点符号:-.!~‘();/?:@&=+$,#,其它字符都将被一个或多个十六进制的转义序列替换。
*作为网址的参数:除了ASCII字母和数字,以及这些ASCII标点符号:-.!~*’(),其它字符都将被一个或多个十六进制的转义序列替换。
也就是说 ;/?:@&=+$,#
这些标点符号作为网址的分隔符时不会被转义,而作为网址的参数传递时都将被转义。
URL 转义序列采用 UTF-8 编码方案。
例子:
“作为完整的网址”如本页的URL,复制下来就能看到中文被转义了。如下:
https://www.qqxiuzi.cn/bianma/URL%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81.htm
“作为网址的参数”例如以下的形式,一个网址是另一个网址的参数。
https://www.qqxiuzi.cn/bianma/URL%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81.htm?url=http%3A%2F%2Fwww.qqxiuzi.cn%2Fbianma%2FURL%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81.htm
【例】flag%7Bthis_is_a_flag%7D
URL解码:flag{this_is_a_flag}
Unicode 编码
Unicode 编码是一种力求容纳世界上所有字符的编码格式,因此也被称为万国码、统一码等等。Unicode 编码给每一个字符都指定了统一且唯一的编码,这使得不同种类的文字可以跨语言、跨平台的应用。
【例】key{you a
re right}
使用 tool.chinaz.com 的 Unicode 转 ASCII工具可以得到 flag:key{you are right}
Morsecode 摩斯码
摩尔斯电码使用 点
(·)和 划
(-)两种符号的特定组合表示不同的字符,在用声音表示时,其中点(·)为短信号,一个时间单位,读作滴,划(-)为长信号,三个时间单位,读作嗒;两个信号间隔一个时间单位,字符间隔三个时间单位,单词间隔七个时间单位。
:::success
摩斯工具合集:https://morsecode.world/
摩斯音频解码工具:https://morsecode.world/international/decoder/audio-decoder-adaptive.html
:::
【例】..-. .-.. .- --.
Morse解码:FLAG
JSFuck
JSFuck 仅仅使用 ()+[]!
这6个字符就可以编码任意的 JavaScript 代码。
uuencode
Uuencode将输入文字以每三个字节为单位进行编码,如此重复进行。如果最后剩下的文字少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符 32
(空白)- 95
(底线) 的范围之中。
- 字符范围:
32
(空白)-95
(下划线) - 没有小写字母
Base64 编码
Base64编码是使用64个可打印ASCII字符(A-Z
、a-z
、0-9
、+
、/
)将任意字节序列数据编码成ASCII字符串,另有 =
符号用作后缀用途。
Base64将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比特则末尾补0。将每组二进制值转换成十进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。
由于二进制数据是按照8比特一组进行传输,因此Base64按照6比特一组切分的二进制数据必须是24比特的倍数(6和8的最小公倍数)。24比特就是3个字节,若原字节序列数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个 =
;若剩下2个输入数据,则在编码结果后加1个 =
。
Base32 编码
Base32编码是使用32个可打印字符(A-Z
和 2-7
)对任意字节数据进行编码的方案,编码后的字符串不区分大小写并排除了容易混淆的字符。
与Base64相比,Base32具有许多优点:
- 适合不区分大小写的文件系统,更利于人类口语交流或记忆。
- 结果可以用作文件名,因为它不包含路径分隔符 “/”等符号。
- 排除了视觉上容易混淆的字符,因此可以准确的人工录入。(例如,RFC4648符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆)。
- 排除填充符号“=”的结果可以包含在URL中,而不编码任何字符。
Base16 编码
Base16编码使用16个ASCII可打印字符(0-9
和 A-F
)对任意字节数据进行编码。
MD5
【例】某天A君的网站被日,管理员密码被改,死活登不上,去数据库一看,啥,这密码md5不是和原来一样吗?为啥登不上咧?d78b6f302l25cdc811adfe8d4e7c9fd34
,请提交PCTF{原来的管理员密码}
md5 是十六进制数,l
不在范围内,把它去掉用 cmd5.com 解密得到:hack
古典密码
移位密码
凯撒密码
Rot 13
替换密码
Bacon 培根密码
编码方式1
Letter | Code | Binary | Decimal | Letter | Code | Binary | Decimal | |
---|---|---|---|---|---|---|---|---|
A | aaaaa | 00000 | 0 | N | abbab | 01101 | 13 | |
B | aaaab | 00001 | 1 | O | abbba | 01110 | 14 | |
C | aaaba | 00010 | 2 | P | abbbb | 01111 | 15 | |
D | aaabb | 00011 | 3 | Q | baaaa | 10000 | 16 | |
E | aabaa | 00100 | 4 | R | baaab | 10001 | 17 | |
F | aabab | 00101 | 5 | S | baaba | 10010 | 18 | |
G | aabba | 00110 | 6 | T | baabb | 10011 | 19 | |
H | aabbb | 00111 | 7 | U | babaa | 10100 | 20 | |
I | abaaa | 01000 | 8 | V | babab | 10101 | 21 | |
J | abaab | 01001 | 9 | W | babba | 10110 | 22 | |
K | ababa | 01010 | 10 | X | babbb | 10111 | 23 | |
L | ababb | 01011 | 11 | Y | bbaaa | 11000 | 24 | |
M | abbaa | 01100 | 12 | Z | bbaab | 11001 | 25 |
编码方式2
Letter | Code | Binary | Decimal | Letter | Code | Binary | Decimal | |
---|---|---|---|---|---|---|---|---|
A | aaaaa | 00000 | 0 | N | abbaa | 01100 | 12 | |
B | aaaab | 00001 | 1 | O | abbab | 01101 | 13 | |
C | aaaba | 00010 | 2 | P | abbba | 01110 | 14 | |
D | aaabb | 00011 | 3 | Q | abbbb | 01111 | 15 | |
E | aabaa | 00100 | 4 | R | baaaa | 10000 | 16 | |
F | aabab | 00101 | 5 | S | baaab | 10001 | 17 | |
G | aabba | 00110 | 6 | T | baaba | 10010 | 18 | |
H | aabbb | 00111 | 7 | U, V | baabb | 10011 | 19 | |
I, J | abaaa | 01000 | 8 | W | babaa | 10100 | 20 | |
K | abaab | 01001 | 9 | X | babab | 10101 | 21 | |
L | ababa | 01010 | 10 | Y | babba | 10110 | 22 | |
M | ababb | 01011 | 11 | Z | babbb | 10111 | 23 |
【例】bacoN is one of aMerICa'S sWEethEartS. it's A dARlinG, SuCCulEnt fOoD tHAt PaIRs FlawLE
大写字母 -> b,小写字母 -> a,去除其他字符:aaaabaaaaaaaabaabbababbaaabaaabaaababbaaabbabbaabaaabababbababbabaaabb
培根方式2解密:BACONISNOTFOOD
baconisnotfood
现代密码
分组密码
公钥密码
RSA
【例】已知 p、q、e,求 d
import gmpy2
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
d = gmpy2.invert(e, (p - 1) * (q - 1))
print(d)
19178568796155560423675975774142829153827883709027717723363077606260717434369
哈希
md5解密
https://www.cmd5.com/
https://www.objectif-securite.ch/ophcrack
https://www.somd5.com/
https://kmd5.cn/
工具
CTF在线工具
CTFCrackTools
RSAtools
小工具
- https://quipqiup.com/ - 字符替换解密
- https://cmd5.com/ - md5 在线解密