CTF中那些脑洞大开的编码和加密.docx
《CTF中那些脑洞大开的编码和加密.docx》由会员分享,可在线阅读,更多相关《CTF中那些脑洞大开的编码和加密.docx(65页珍藏版)》请在冰豆网上搜索。
CTF中那些脑洞大开的编码和加密
CTF中那些脑洞大开的编码和加密
0x00前言
正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:
表哥,你知道这是什么加密吗?
其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下。
本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧!
最后欢迎小伙伴来[博客](https:
//www.hackfun.org/)玩耍:
P(ps:
由于写文章是用markdown,而论坛编辑器不支持markdown语法,虽然我已经尽力去调整对其字符,可是效果还是不尽人意,如果影响阅读理解可以去博客阅读:
P)
0x01目录
常见编码:
1.ASCII编码
2.Base64/32/16编码
3.shellcode编码
4.Quoted-printable编码
5.XXencode编码
6.UUencode编码
7.URL编码
8.Unicode编码
9.Escape/Unescape编码
10.HTML实体编码
11.敲击码(Tapcode)
12.莫尔斯电码(MorseCode)
13.编码的故事
各种文本加密
换位加密:
1.栅栏密码(Rail-fenceCipher)
2.曲路密码(CurveCipher)
3.列移位密码(ColumnarTranspositionCipher)
替换加密:
1.埃特巴什码(AtbashCipher)
2.凯撒密码(CaesarCipher)
3.ROT5/13/18/47
4.简单换位密码(SimpleSubstitutionCipher)
5.希尔密码(HillCipher)
6.猪圈密码(PigpenCipher)
7.波利比奥斯方阵密码(PolybiusSquareCipher)
8.夏多密码(曲折加密)
9.普莱菲尔密码(PlayfairCipher)
10.维吉尼亚密码(VigenèreCipher)
11.自动密钥密码(AutokeyCipher)
12.博福特密码(BeaufortCipher)
13.滚动密钥密码(RunningKeyCipher)
14.Porta密码(PortaCipher)
15.同音替换密码(HomophonicSubstitutionCipher)
16.仿射密码(AffineCipher)
17.培根密码(BaconianCipher)
18.ADFGX和ADFGVX密码(ADFG/VXCipher)
19.双密码(BifidCipher)
20.三分密码(TrifidCipher)
21.四方密码(Four-SquareCipher)
22.棋盘密码(CheckerboardCipher)
23.跨棋盘密码(StraddleCheckerboardCipher)
24.分组摩尔斯替换密码(FractionatedMorseCipher)
25.Bazeries密码(BazeriesCipher)
26.Digrafid密码(DigrafidCipher)
27.格朗普雷密码(GrandpréCipher)
28.比尔密码(Bealeciphers)
29.键盘密码(KeyboardCipher)
其他有趣的机械密码:
1.恩尼格玛密码
代码混淆加密:
1.asp混淆加密
2.php混淆加密
3.css/js混淆加密
4.VBScript.Encode混淆加密
5.ppencode
6.rrencode
7.jjencode/aaencode
8.JSfuck
9.jother
10.brainfuck编程语言
相关工具
参考网站
彩蛋
0x02正文
常见编码
1.ASCII编码
ASCII编码大致可以分作三部分组成:
第一部分是:
ASCII非打印控制字符(参详ASCII码表中0-31);
第二部分是:
ASCII打印字符,也就是CTF中常用到的转换;
第三部分是:
扩展ASCII打印字符(第一第三部分详见[ASCII码表](
编码转换示例
源文本:
`Thequickbrownfoxjumpsoverthelazydog`
ASCII编码对应十进制:
841041013211311710599107329811411111911032102111120321061171091121153211111810111432116104101321089712212132100111103
对应可以转换成二进制,八进制,十六进制等。
2.Base64/32/16编码
base64、base32、base16可以分别编码转化8位字节为6位、5位、4位。
16,32,64分别表示用多少个字符来编码,这里我注重介绍base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。
包括MIME的email,emailviaMIME,在XML中存储复杂数据。
编码原理:
Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+,/这64个编码字符,=号不属于编码字符,而是填充字符)的原因,这样就需要一张映射表,如下:
举个例子(base64):
>源文本:
T h e
>
>对应ascii码:
84104101
>
>8位binary:
010101000110100001100101
>
>6位binary:
010101000110100001100101
>
>高位补0:
000010101000001100010000100100101
>
>对应ascii码:
21 6 33 37
>
>查表:
V G h l
利用Pythonbase64模块,我们分别可以这样加密解密base643216:
3.shellcode编码
源文本:
`Thequickbrownfoxjumpsoverthelazydog`
编码后:
4.Quoted-printable编码
它是多用途互联网邮件扩展(MIME)一种实现方式。
有时候我们可以邮件头里面能够看到这样的编码,编码原理[参考](
源文本:
`敏捷的棕色狐狸跳过了懒惰的狗`
编码后:
958F898495898B908B
87868792839848B97
编码解码[链接](
5.XXencode编码
XXencode将输入文本以每三个字节为单位进行编码。
如果最后剩下的资料少于三个字节,不够的部份用零补齐。
这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。
以所对应值的位置字符代替。
它所选择的可打印字符是:
+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64个字符。
跟base64打印字符相比,就是UUencode多一个“-”字符,少一个”/”字符。
源文本:
`Thequickbrownfoxjumpsoverthelazydog`
编码后:
`hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNkc+`
编码解码[链接](
6.UUencode编码
UUencode是一种二进制到文字的编码,最早在unix邮件系统中使用,全称:
Unix-to-Unixencoding,UUencode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。
三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。
这个数值只会落在0到63之间。
然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。
源文本:
`Thequickbrownfoxjumpsoverthelazydog`
编码后:
`M5&AE('%U:
6-K(&)R;W=N(&9O>"!
J=6UPO=F5R('1H92!
L87IY(&1O9PH*`
编码解码[链接](
7.URL编码
url编码又叫百分号编码,是统一资源定位(URL)编码方式。
URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:
@等),剩下的其它所有字符必须通过%xx编码处理。
现在已经成为一种规范了,基本所有程序语言都有这种编码,如js:
有encodeURI、encodeURIComponent,PHP有urlencode、urldecode等。
编码方法很简单,在该字节ascii码的的16进制字符前面加%.如空格字符,ascii码是32,对应16进制是'20',那么urlencode编码结果是:
%20。
源文本:
`Thequickbrownfoxjumpsoverthelazydog`
编码后:
%54%68%65%20%71%75%69%63%6b%20%62%72%6f%77%6e%20%66%6f%78%20%6a%75%6d%70%73%20%6f%76%65%72%20%74%68%65%20%6c%61%7a%79%20%64%6f%67
编码解码[链接](
8.Unicode编码
Unicode编码有以下四种编码方式:
源文本:
`The`
&x[Hex]:
`&x0054;&x0068;&x0065;`
&[Decimal]:
`&00084;&00104;&00101;`
\U[Hex]:
`\U0054\U0068\U0065`
\U+[Hex]:
`\U+0054\U+0068\U+0065`
编码解码[链接](
9.Escape/Unescape编码
Escape/Unescape加密解码/编码解码,又叫%u编码,采用UTF-16BE模式,Escape编码/加密,就是字符对应UTF-1616进制表示方式前面加%u。
Unescape解码/解密,就是去掉"%u"后,将16进制字符还原后,由utf-16转码到自己目标字符。
如:
字符“中”,UTF-16BE是:
“6d93”,因此Escape是“%u6d93”。
源文本:
`The`
编码后:
`%u0054%u0068%u0065`
10.HTML实体编码
完整编码手册[参考](
11.敲击码
敲击码(Tapcode)是一种以非常简单的方式对文本信息进行编码的方法。
因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
敲击码表:
12345
1
2
3
4
5
12.莫尔斯电码
摩尔斯电码(MorseCode)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:
1.点(.)
2.划(-)
3.每个字符间短的停顿(通常用空格表示停顿)
4.每个词之间中等的停顿(通常用`/`划分)
5.以及句子之间长的停顿
摩尔斯电码字母和数字对应表:
A .- N -. . .-.-.- + .-.-. 1 .----
B -... O --- , --..-- _ ..--.- 2 ..---
C -.-. P .--. :
---... $ ...-..- 3 ...--
D -.. Q --.- " .-..-. & .-... 4 ....-
E . R .-. ' .----. / -..-. 5 .....
F ..-. S ... !
-.-.-- 6 -....
G --. T - ?
..--.. 7 --...
H .... U ..- @ .--.-. 8 ---..
I .. V ...- - -....- 9 ----.
J .--- W .-- ; -.-.-. 0 -----
K -.- X -..- ( -.--.
L .-.. Y -.-- ) -.--.-
M -- Z --.. = -...-
源文本:
`THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG`
编码后:
-...../--.-..-..-.-.-.-/-....-.---.---./..-.----..-/.---..---.--..../---...-..-./-...../.-...---..-.--/-..-----.
在线编码解码[传送门](
摩尔斯电码除了能对字母数字编码以外还对一些标点符号,非英语字符进行了编码,而且还有一些特定意义的组合称为特殊符号,比如`·-·-·-·-·-`表达的意思是调用信号,表示“我有消息发送”。
如果你感兴趣可以参考[WiKi](https:
//zh.wikipedia.org/wiki/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81)。
13.编码的故事
推荐大家去看[编码的故事](
各种文本加密
文本加密可以将正常文本内容打乱为不可连读的文字或符号(汉字数字字母音乐符号国际音标盲文韩文日文傣文彝文箭头符号花朵符号俄文),换行等格式信息也会被清除,达到加密的作用。
在进行文本加密时可以设定一个密码,这样只有知道密码的人才能解密文本。
密码可以是数字、字母和下划线,最多九位。
加密示例:
源文本:
`敏捷的棕色狐狸跳过了懒惰的狗`
编码解码[链接](
换位加密
1.栅栏密码
**
(1)介绍**
栅栏密码(Rail-fenceCipher)就是把要加密的明文分成N个一组,然后把每组的第1个字符组合,每组第2个字符组合...每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是密文,这里以2栏栅栏加密为例。
明文:
`Thequickbrownfoxjumpsoverthelazydog`
去空格:
`Thequickbrownfoxjumpsoverthelazydog`
分组:
`Thequickbrownfoxjumpsoverthelazydog`
第一组:
`Teucbonojmsvrhlzdg`
第二组:
`hqikrwfxupoeteayo`
密文:
`Teucbonojmsvrhlzdghqikrwfxupoeteayo`
加解密[传送门](
2.曲路密码
曲路密码(CurveCipher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)。
明文:
`Thequickbrownfoxjumpsoverthelazydog`
填入5行7列表(事先约定填充的行列数)
加密的回路线(事先约定填充的行列数)
密文:
`gesfcinphodtmwuqouryzejrehbxvalookT`
3.列移位密码
**
(1)介绍**
列移位密码(ColumnarTranspositionCipher)是一种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文。
下面我们以明文Thequickbrownfoxjumpsoverthelazydog,密钥howareu为例:
填入5行7列表(事先约定填充的行列数,如果明文不能填充完表格可以约定使用某个字母进行填充)
密钥:
`howareu`
按howareu在字母表中的出现的先后顺序进行编号,我们就有a为1,e为2,h为3,o为4,r为5,u为6,w为7,所以先写出a列,其次e列,以此类推写出的结果便是密文:
密文:
`qouryinphoTkoolhbxvauwmtdcfsegerjez`
这里提供一个行列数相等的填充规则列移位密码加解密[链接](
另外由列移位密码变化来的密码也有其他的,比如[Amsco密码](Cipher)和[Cadenus密码](Cipher)。
替换加密
1.埃特巴什码
**
(1)介绍**
埃特巴什码(AtbashCipher)是一种以字母倒序排列作为特殊密钥的替换加密,也就是下面的对应关系:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA
明文:
`thequickbrownfoxjumpsoverthelazydog`
密文:
`gsvjfrxpyildmulcqfnkhlevigsvozabwlt`
加解密[传送门](
2.凯撒密码
**
(1)介绍**
凯撒密码(CaesarCipher或称恺撒加密、恺撒变换、变换加密、位移加密)是一种替换加密,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推,