密码学类题目考查各种加解密技术,包括古典密码和现代密码,甚至是出题者自创加密技术。

  • 大多数基于现代密码学理论与算法出题
    • 需要大量的密码学算法分析和算法积累
    • 基本都是在做算法攻击
    • 密码学算法误用
      • 例如:不正确的使用 RSA 算法可以造成密钥被爆破
  • 少量的古典密码或古典密码的变形
  • 需要比较厚实的数学(数论)基础

在线编码解码工具合集:https://www.yuque.com/poetdp/wlaq/ttwtfr


编码与解码

ASCII 编码

ascii-en.png

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(下划线)
  • 没有小写字母

image.png

Base64 编码

Base64编码是使用64个可打印ASCII字符(A-Za-z0-9+/)将任意字节序列数据编码成ASCII字符串,另有 = 符号用作后缀用途。
image.png
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-Z2-7)对任意字节数据进行编码的方案,编码后的字符串不区分大小写排除了容易混淆的字符
image.png
与Base64相比,Base32具有许多优点:

  • 适合不区分大小写的文件系统,更利于人类口语交流或记忆。
  • 结果可以用作文件名,因为它不包含路径分隔符 “/”等符号。
  • 排除了视觉上容易混淆的字符,因此可以准确的人工录入。(例如,RFC4648符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆)。
  • 排除填充符号“=”的结果可以包含在URL中,而不编码任何字符。

Base16 编码

Base16编码使用16个ASCII可打印字符(0-9A-F)对任意字节数据进行编码。
image.png

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

  1. import gmpy2
  2. p = 3487583947589437589237958723892346254777
  3. q = 8767867843568934765983476584376578389
  4. e = 65537
  5. d = gmpy2.invert(e, (p - 1) * (q - 1))
  6. print(d)

19178568796155560423675975774142829153827883709027717723363077606260717434369

哈希

md5解密
https://www.cmd5.com/
https://www.objectif-securite.ch/ophcrack
https://www.somd5.com/
https://kmd5.cn/


工具

CTF在线工具

http://ctf.ssleye.com/

CTFCrackTools

RSAtools

小工具