CTF中那些脑洞大开的编码和加密

Posted ssooking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTF中那些脑洞大开的编码和加密相关的知识,希望对你有一定的参考价值。

原文:

http://www.tuicool.com/articles/2E3INnm

http://www.secbox.cn/hacker/ctf/8078.html

 

0x01 目录

  1. 常见编码:

    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. 敲击码(Tap code)
    12. 莫尔斯电码(Morse Code)
    13. 编码的故事
  2. 各种文本加密

  3. 换位加密:

    1. 栅栏密码(Rail-fence Cipher)
    2. 曲路密码(Curve Cipher)
    3. 列移位密码(Columnar Transposition Cipher)
  4. 替换加密:

    1. 埃特巴什码(Atbash Cipher)
    2. 凯撒密码(Caesar Cipher)
    3. ROT5/13/18/47
    4. 简单换位密码(Simple Substitution Cipher)
    5. 希尔密码(Hill Cipher)
    6. 猪圈密码(Pigpen Cipher)
    7. 波利比奥斯方阵密码(Polybius Square Cipher)
    8. 夏多密码(曲折加密)
    9. 普莱菲尔密码(Playfair Cipher)
    10. 维吉尼亚密码(Vigenère Cipher)
    11. 自动密钥密码(Autokey Cipher)
    12. 博福特密码(Beaufort Cipher)
    13. 滚动密钥密码(Running Key Cipher)
    14. Porta密码(Porta Cipher)
    15. 同音替换密码(Homophonic Substitution Cipher)
    16. 仿射密码(Affine Cipher)
    17. 培根密码(Baconian Cipher)
    18. ADFGX和ADFGVX密码(ADFG/VX Cipher)
    19. 双密码(Bifid Cipher)
    20. 三分密码(Trifid Cipher)
    21. 四方密码(Four-Square Cipher)
    22. 棋盘密码(Checkerboard Cipher)
    23. 跨棋盘密码(Straddle Checkerboard Cipher)
    24. 分组摩尔斯替换密码(Fractionated Morse Cipher)
    25. Bazeries密码(Bazeries Cipher)
    26. Digrafid密码(Digrafid Cipher)
    27. 格朗普雷密码(Grandpré Cipher)
    28. 比尔密码(Beale ciphers)
    29. 键盘密码(Keyboard Cipher)
  5. 其他有趣的机械密码:

    1. 恩尼格玛密码
  6. 代码混淆加密:

    1. asp混淆加密
    2. php混淆加密
    3. css/js混淆加密
    4. VBScript.Encode混淆加密
    5. ppencode
    6. rrencode
    7. jjencode/aaencode
    8. JSfuck
    9. jother
    10. brainfuck编程语言
  7. 相关工具

  8. 参考网站

0x01 Base64

Base64:

ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10pNTU2NJC3ODHHYWJIZ3P4ZWY=

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用\'=\',因此编码后输出的文本末尾可能会出现1或2个\'=\'

Base32: Base32和Base64相比只有一个区别就是,用32个字符表示256个ASC字符,也就是说5个ASC字符一组可以生成8个Base字符,反之亦然。

base64在线编解码

当然还有base32和base16加密,base64全家桶可以用python里的base64模块来搞定。

参考链接1

参考链接2

0x02 希尔密码

希尔密码:密文: 22,09,00,12,03,01,10,03,04,08,01,17 (明文:wjamdbkdeibr)

解题思路:使用的矩阵是 1 2 3 4 5 6 7 8 10

更多请参考原文链接

详见百度百科

 

0x03 栅栏密码

栅栏密码:把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。

密文样例:tn c0afsiwal kes,hwit1r  g,npt  ttessfu}ua u  hmqik e {m,  n huiouosarwCniibecesnren.

解密程序:

更多请参考原文链接 百度百科

 

0x04 凯撒密码

那些年做过的ctf之加密篇(补充篇)-安全盒子

凯撒密码:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

密文样例:

U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJG*bRH7YJH7YSH]*=93dVZ3^S8*$:8"&:9U]RH;g=8Y!U92\'=j*$KH]ZSj&[S#!gU#*dK9\\.

解题思路:得知是凯撒加密之后,尝试进行127次轮转爆破:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
lstr="""U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJG*bRH7YJH7YSH]*=93dVZ3^S8*$:8"&:9U]RH;g=8Y!U92\'=j*$KH]ZSj&[S#!gU#*dK9\\."""</p>
for p in range(127):
str1 \'\'
for i in lstr:
temp chr((ord(i)+p)%127)
if 32<ord(temp)<127 :
str1 = str1 + temp
feel 1
else:
feel 0
break
if feel == 1:
print(str1)

更多请参考原文链接

 

0x05 维吉利亚加密

那些年做过的ctf之加密篇(补充篇)-安全盒子

凯撒密码的升级,更多详见百度百科

 

0x06 Unicode

密文样例:

\\u5927\\u5bb6\\u597d\\uff0c\\u6211\\u662f\\u0040\\u65e0\\u6240\\u4e0d\\u80fd\\u7684\\u9b42\\u5927\\u4eba\\uff01\\u8bdd\\u8bf4\\u5fae\\u535a\\u7c89\\u4e1d\\u8fc7\\

unicode在线解密

 

0x07 brainfuck

类型:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

利用BFVM.exe直接解密

用法 loadtxt 1.txt

brainfuck在线解密

 

0x08 摩斯密码

那些年做过的ctf之加密篇(补充篇)-安全盒子

密文样例:--  ---  .-.  ...  .

摩斯密码在线翻译

 

0x09 jsfuck or jother

把 JavaScript 代码转为 ()[]{}!+ 字符

密文样例:

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

在线解密:

1.jsfuck

2.patriciopalladino

其他解密方式:alert(xxx)、console(xxx)、document.write(xxx)即可(xxx为编码内容)。

那些年做过的ctf之加密篇(补充篇)-安全盒子

更多jother介绍请参考:jother编码之谜

 

0x0a 培根密码

那些年做过的ctf之加密篇(补充篇)-安全盒子

培根所用的密码是一种本质上用二进制数设计的。不过,他没有用通常的0和1来表示,而是采用a和b。

详见百度百科

 

0x0b 猪圈密码又称共济会密码

那些年做过的ctf之加密篇(补充篇)-安全盒子

详见百度百科

 

0x0c CRC32

密文样例:4D1FAE0B

1
2
3
4
5
6
7
import zlib
def crc32(st):
crc zlib.crc32(st)
if crc 0:
return "%x" % (crc)
else:
return "%x" % (~crc ^ 0xffffffff)

更多请参考原文链接

 

 

0x0d其他的一些脑洞加密解密参考

 

那些年做过的ctf之加密篇(补充篇)-安全盒子

(1)当铺密码

 

那些年做过的ctf之加密篇(补充篇)-安全盒子

(2)非斯的象形文字翻译图

那些年做过的ctf之加密篇(补充篇)-安全盒子

(3)ADFGX加密法

那些年做过的ctf之加密篇(补充篇)-安全盒子

(4)电脑键盘QWE加密法

那些年做过的ctf之加密篇(补充篇)-安全盒子

(5)电脑键盘棋盘加密

那些年做过的ctf之加密篇(补充篇)-安全盒子

(6)电脑键盘坐标加密

那些年做过的ctf之加密篇(补充篇)-安全盒子

(7)手机键盘加密解密

那些年做过的ctf之加密篇(补充篇)-安全盒子

(8)数字坐标加密字母

那些年做过的ctf之加密篇(补充篇)-安全盒子

(9)字母表顺序加密法和反字母

分享一个小技巧,如果没有什么思路可以试试在线词频分析

对于其他一些未知密文,可尝试到下列几个网站转换试试,看看运气

http://web.chacuo.net/charsetuuencode

http://blog.csdn.net/ab748998806/article/details/46368337

说到字符转换,不得不的说到JPK神器

 

那些年做过的ctf之加密篇(补充篇)-安全盒子

CTF一次完美优雅的利用请看AppLeU0大大的隐写术总结中的题目为双图的解题过程,除此之外JPK还有很多功能等你去搞鼓

0x0e其他加密算法和哈希散列

AES RSA RC4 Rabbit TripleDes

SHA1 SHA224 SHA256 SHA384 SHA512 MD5 MD4 MD3 MD2 HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 HmacMD5 PBKDF2 太多了。。。

可以参考网上许多的在线解密网站(百度和谷歌来搜索,小技巧:用谷歌时这样用 MD5 onlie crack, MD5 online decode 类似)和工具。

0x0f 混淆加密

列举一些常见的混淆加密

asp混淆加密

php混淆加密

css/js混淆加密

VBScript.Encode混淆加密

 

 

0x02 正文

常见编码

1.ASCII编码

ASCII编码大致可以分作三部分组成:

第一部分是:ASCII非打印控制字符(参详ASCII码表中0-31);

第二部分是:ASCII打印字符,也就是CTF中常用到的转换;

第三部分是:扩展ASCII打印字符(第一第三部分详见 ASCII码表 解释)。

编码转换示例

源文本: The quick brown fox jumps over the lazy dog

ASCII编码对应十进制:

#!shell
84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 32 102 111 120 32 106 117 109 112 115 32 111 118 101 114 32 116 104 101 32 108 97 122 121 32 100 111 103

对应可以转换成二进制,八进制,十六进制等。

2.Base64/32/16编码

base64、base32、base16可以分别编码转化8位字节为6位、5位、4位。16,32,64分别表示用多少个字符来编码,这里我注重介绍base64。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在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码:84 104 101

8位binary:01010100 01101000 01100101

6位binary:010101 000110 100001 100101

高位补0:000010101 00000110 00100001 00100101

对应ascii码:21 6 33 37

查表:V G h l

利用Python base64模块,我们分别可以这样加密解密base64 32 16:

3.shellcode编码

源文本: The quick brown fox jumps over the lazy dog

编码后:

#!shell
\\x54\\x68\\x65\\x7f\\x71\\x75\\x69\\x63\\x6b\\x7f\\x62\\x72\\x6f\\x77\\x6e\\x7f\\x66\\x6f\\x78\\x7f\\x6a\\x75\\x6d\\x70\\x73\\x7f\\x6f\\x76\\x65\\x72\\x7f\\x74\\x68\\x65\\x7f\\x6c\\x61\\x7a\\x79\\x7f\\x64\\x6f\\x67

4.Quoted-printable 编码

它是多用途互联网邮件扩展(MIME) 一种实现方式。有时候我们可以邮件头里面能够看到这样的编码,编码原理 参考 。

源文本: 敏捷的棕色狐狸跳过了懒惰的狗

编码后:

#!shell
=E6=95=8F=E6=8D=B7=E7=9A=84=E6=A3=95=E8=89=B2=E7=8B=90=E7=8B=B8=E8=B7=B3=E8
=BF=87=E4=BA=86=E6=87=92=E6=83=B0=E7=9A=84=E7=8B=97

编码解码 链接

5.XXencode编码

XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64个字符。跟base64打印字符相比,就是UUencode多一个“-” 字符,少一个”/” 字符。

源文本: The quick brown fox jumps over the lazy dog

编码后: hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNkc+

编码解码 链接

6.UUencode编码

UUencode是一种二进制到文字的编码,最早在unix 邮件系统中使用,全称:Unix-to-Unix encoding,UUencode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。

源文本: The quick brown fox jumps over the lazy dog

编码后: M5&AE(\'%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R(\'1H92!L87IY(&1O9PH*

编码解码 链接

7.URL编码

url编码又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。 现在已经成为一种规范了,基本所有程序语言都有这种编码,如js:有encodeURI、encodeURIComponent,PHP有 urlencode、urldecode等。编码方法很简单,在该字节ascii码的的16进制字符前面加%. 如 空格字符,ascii码是32,对应16进制是\'20\',那么urlencode编码结果是:%20。

源文本: The quick brown fox jumps over the lazy dog

编码后:

#!shell
%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-16 16进制表示方式前面加%u。Unescape解码/解密,就是去掉"%u"后,将16进制字符还原后,由utf-16转码到自己目标字符。如:字符“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”。

源文本: The

编码后: %u0054%u0068%u0065

10.HTML实体编码

完整编码手册 参考

11.敲击码

敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。

敲击码表:

#!shell
  1  2  3  4  5
1 A  B C/K D  E
2 F  G  H  I  J 
3 L  M  N  O  P
4 Q  R  S  T  U
5 V  W  X  Y  Z

12.莫尔斯电码

摩尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:

  1. 点(.)
  2. 划(-)
  3. 每个字符间短的停顿(通常用空格表示停顿)
  4. 每个词之间中等的停顿(通常用 / 划分)
  5. 以及句子之间长的停顿

摩尔斯电码字母和数字对应表:

#!shell
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  --..  =  -...-

以上是关于CTF中那些脑洞大开的编码和加密的主要内容,如果未能解决你的问题,请参考以下文章

那些年做过的ctf之加密篇

CTF之杂项总结

脑洞大开

脑洞大开之稀奇创意

SwiftUI脑洞大开打造实时显示当前值的Slider

Github上,那些很骚的东西~