CTF盘点系列——脑洞大开的编码&加解密

前言

玩过CTF的小伙伴会经常遇到类似这样的问题:dalao这是啥编码方式啊?怎么解密啊?

其实CTF中的脑洞密码题,通常是费现代加密方式,一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但都会留下不少线索,当然也需要参赛者对于各种编码方式有所了解,这样更有利于快速入手解密,结合一定的脑洞,拿到Flag就so easy了.

编码方式汇总

常见编码

ASCii编码

Base64/32/16编码

shellcode编码

Quoted-printable编码

XXencode编码

UUencode编码

URL编码

Unicode编码

Escape/Unescape编码

HTML实体编码

Tap Code敲击码

Morse Code摩尔斯电码

各种文本加密

换位加密

Rail-fence Cipher栅栏密码

Curve Cipher曲路密码

Columnar Transposition Cipher列位移加密

替换加密

Atbash Cipher埃特巴什码

Caesar Cipher凯撒密码

ROT5/13/18/47

Simple Substitution Cipher简单换位密码

Hill Cipher希尔密码

Pigpen Cipher猪圈密码

Polybius Square Cipher波利比奥斯方阵密码

夏多密码(曲折加密)

Playfair Cipher普莱费尔密码

Vigenere Cipher维吉尼亚密码

Autokey Cipher自动密钥密码

Beaufort Cipher波弗特密码

Running Key Cipher滚动密钥密码

Porta Cipher

Homophonic Substitution Cipher同音替换密码

Affine Cipher仿射密码

Baconian Cipher培根密码

ADFG/VX Cipher ADFG和ADFGVX密码

Bifid Cipher双密码

Trifid Cipher三分密码

Four-Square Cipher四方密码

Checkerboard Cipher棋盘密码

============================

Base64

ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10p

NTU2NJC3ODHHYWJIZ3P4ZWY=

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

Base32

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

在线编解码

希尔密码

密文: 22,09,00,12,03,01,10,03,04,08,01,17
明文:wjamdbkdeibr

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

a b c d e f g h i j k l m n o p q r s t u v w x y z

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

把字母用数字表示,解密时把数字转换成字母,然后放入脚本,密钥要分成矩阵。一般是对称的

原文链接

百度百科

脚本已存

栅栏密码

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

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

解密程序:

char s[]= “tn c0afsiwal kes,hwit1r  g,npt  ttessfu}ua u  hmqik e {m,  n huiouosarwCniibecesnren.”;
char t[86]= “”;
int i,j,k;
k=0;
for (i=0;i<17;i++)
{
for(j=0;j<5;j++)
{
t[k++]= ch[j*17+i];
}
}
for(i=0;i<85;i++)
{
printf(“%c”,t[i]);
}

原文链接

在线解密

凯撒密码

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

常规解密:

from pycipher import Caesar
for i in range(1,27):
str=Caesar(key=i).encipher(‘UIF RVJDLCSPXOGPYKVNQTPWFSUIFMBAZEPH’)
print “mingwen:”+str.lower()+“rn“

密文样例:U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJGbRH7YJH7YSH]=93dVZ3^S8$:8″&:9U]RH;g=8Y!U92’=j$KH]ZSj&[S#!gU#*dK9.

解题思路:

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

lstr=”””U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJG*bRH7YJH7YSH]*=93dVZ3^S8*$:8″&:9U]RH;g=8Y!U92’=j*$KH]ZSj&[S#!gU#*dK9.”””
forp 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)

原文链接

Unicode

密文样例:u5927u5bb6u597duff0cu6211u662fu0040u65e0u6240u4e0du80fdu7684u9b42u5927u4ebauff01u8bddu8bf4u5faeu535au7c89u4e1du8fc7

在线解密

brainfuck

类型:++++++++++[>+++++++>++++++++++>+++>+<<<<-]

++.>+.+++++++..+++.>++.<<+++++++++++++++.

.+++.——.——–.>+.>.

利用BFVM.exe直接解密

用法 loadtxt 1.txt

在线解密

摩斯密码

密文样例:– — .-. … .

在线解密

jsfuck

密文中 ()[]{}!+

在线解密

在线解密

如果jsfuck定义的是一个函数并且最后以()结尾,则在火狐console中运行时函数也会运行,就会错掉什么提示。这时候需要把最后的()换成.toString()

培根密码

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

百科链接

已知将一个flag以一种加密形式为使用密钥进行加密,使用密钥WELCOMETOCFF加密后密文为

培根密码表看其他文件

费娜姆密码

异或

已知将一个flag以一种加密形式为使用密钥进行加密,使用密钥WELCOMETOCFF加密后密文为 00000000000000000000000000000000000

0000000000000000101110000110001000000101000000001 请分析出flag。

密钥为12位,密文为84位,可能是异或:

7位二进制可能表示字母顺序:

W E L C O M E T O C F F

密文

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0010111 0000110 0010000 0010100 0000001

密钥

0010111 0000101 0001100 0000011 0001111 0001101 0000101 0010100 0001111 0000011 0000110 0000110

Xor

0010111 0000101 0001100 0000011 0001111 0001101 0000101 0000011 0001001 0010011 0010010 0000111

W E L C O M E C I S R G

即:WELCOMECISRG

flag:WELCOMECISRG

猪圈密码,又称共济会密码

百度百科

CRC32

密文样例:4D1FAE0B

import zlib

def crc32(st):

crc = zlib.crc32(st)

if crc > 0:

return “%x” % (crc)

else:

return “%x” % (~crc ^ 0xffffffff)

原文链接

颜文字加密(aaencode)

这个好萌啊>.<

颜文字js加密:明文alert(“flag”);

密文:゚ω゚ノ= /`m´)ノ ~┻━┻ //´∇`/ [‘’]; o=(゚ー゚) ==3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o_o)/ (o_o);(゚Д゚)={゚Θ゚: ‘’ ,゚ω゚ノ : ((゚ω゚ノ==3) +’’) [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ ‘’)[o^^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +’’)[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +’’) [c language=”_o”][/c];(゚Д゚) [‘c’] = ((゚Д゚)+’’) [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) [‘o’] = ((゚Д゚)+’’) [゚Θ゚];(゚o゚)=(゚Д゚) [‘c’]+(゚Д゚) [‘o’]+(゚ω゚ノ +’’)[゚Θ゚]+ ((゚ω゚ノ==3) +’’) [゚ー゚] + ((゚Д゚) +’’) [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +’’) [゚Θ゚]+((゚ー゚==3) +’’) [(゚ー゚) – (゚Θ゚)]+(゚Д゚) [‘c’]+((゚Д゚)+’’) [(゚ー゚)+(゚ー゚)]+ (゚Д゚) [‘o’]+((゚ー゚==3) +’’) [゚Θ゚];(゚Д゚) [‘’] =(o_o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +’’) [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+’’) [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +’’) [o^^o -゚Θ゚]+((゚ー゚==3) +’’) [゚Θ゚]+ (゚ω゚ノ +’’) [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]=’\’; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o_o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +’’)[c language=”^^o”][/c];(゚Д゚) [゚o゚]='”‘;(゚Д゚) [‘’] ( (゚Д゚) [‘’] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o_o) +(o_o))+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o_o) +(o_o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c_o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o_o) +(o_o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o_o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o_o))+ (o_o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) (‘_’);

在线解密

Jjencode

密文:$=~[];$={:++$,$$$$:(![]+””)[$],$:++$,$$:(![]+””)[$],$:++$,$$$:({}+””)[$],$$$:($[$]+””)[$],$$:++$,$$$:(!””+””)[$],$:++$,$$:++$,$$:({}+””)[$],$$:++$,$$$:++$,$:++$,$$:++$};$.$=($.$=$+””)[$.$$]+($.$=$.$[$.$])+($.$$=($.$+””)[$.$])+((!$)+””)[$.$$]+($.=$.$[$.$$])+($.$=(!””+””)[$.$])+($.=(!””+””)[$.$])+$.$[$.$$]+$.+$.$+$.$;$.$$=$.$+(!””+””)[$.$$]+$.+$.+$.$+$.$$;$.$=($.)[$.$][$.$];$.$($.$($.$$+”””+$.$$+(![]+””)[$.$]+$.$$$+”\”+$.$+$.$$+$.$+$.+”(\”\”+$.$+$.$+$.+$.$$$+(![]+””)[$.$]+(![]+””)[$.$]+$.$+”,\”+$.$+$.+”\”+$.$+$.$+$.$+$.$$+”\”+$.$+$.$$+$.$$+$.$$+”\”+$.$+$.$+$.$$+$.$$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.+$.+”\”\”+$.$+$._+”)”+”””)())();

解密地址

无字母加密

<?php

@$_++; // $_ = 1

$__=(“#”^”|”); // $__ = _

$__.=(“.”^”~”); // _P

$__.=(“/”^”`”); // _PO

$__.=(“|”^”/”); // _POS

$__.=(“{“^”/”); // _POST

${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);

?>

在线解密

Utf-7编解码

原文:gdfgdfg

密文:+AGcAZABmAGcAZABmAGc-

无论何种,都是+开头-结尾

在线解密

云影密码

如果密码只有01248组成。。。

原理很简单,有了1,2,4,8这四个简单的数字,你可以以加法表示出0-9任何一个数字,例如0=28,7=124,9=18。

这样,再用1-26来表示A-Z,就可以用作密码了。

为了不至于混乱,我个人引入了第五个数字0,来用作间隔,以避免翻译错误,所以还可以称“01248密码”。

题目:12401011801180212011401804

第一步,分割,即124 1 118 118 212 114 18 4

第二步,基本翻译,例如124可以表示7,也可以表示16(但不可能是34,因为不会超过26),所以可以放在一边,翻译其他没有异议的,可得:124 a s s w o 18 d

第三步,推测得出明文。可以推测后面的18表示r,前面的为p最合适。

明文:password(密码).

RC4

key welcometoicqedu

密文UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw==

用脚本解密 脚本已存

曼彻斯特

转二进制 不是10就是01 即是曼彻斯特 解密看脚本

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

在线解密

在线解密

在线解密

其他小技巧:

  • 如果密文是十进制,字符范围为“0-9”,可以猜测是ASCII编码;

  • 如果密文由“a-z”“A-Z”和“=”构成,特别是末尾有“=”,那么可以判断为Base64编码;

  • 如果密文含有“%” ,形式为 “%xx” 和 “%uxxxx”,字符范围又是十六进制“0-F”,判断是escape() 函数编码,用unescape()解码;

  • 若密文由“[],(),{},+,!”字符组成的编码通常就通过Jother解密。

判断出可能的编码方式,就可以使用程序或工具进行解密。

推荐阅读更多精彩内容

  • 0x01 目录 常见编码: ASCII编码 Base64/32/16编码 shellcode编码 Quoted-p...
    H0f_9阅读 5,753评论 2 12
  • CTF中那些脑洞大开的编码和加密 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问...
    AlexMercer313阅读 2,453评论 0 16
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    voyagelab阅读 6,134评论 5 29
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 901评论 0 12
  • 一、自定义控件 1. 尺寸单位单位 dp:当使用dp时,不同像素密度的手机上能显示基本相同的长度,一般而言,非文字...
    ezero阅读 19评论 0 0