CTF比赛中主要分为逆向破解,Web安全,加密解密,PWN等几大类,本文主要总结一些自己做过的ctf的以下加密解密的方法和工具等。
0x01 Base64
Base64顾名思义就是用64个可显示字符表示所有的ASC字符,64也就是6Bits,而ASC字符一共有256个,也就是8Bits。Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’
内存1个字符占8位
例如
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了 高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
形式
ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10pNTU2NJC3ODHHYWJIZ3P4ZWY=
Base64在线编码解码地址
0x02 Base32
Base32和Base64相比只有一个区别就是,用32个字符表示256个ASC字符,也就是说5个ASC字符一组可以生成8个Base字符。
Base32在线编码解码地址
注:以上两种编码都可以使用python的base64模块来加解密
0x03 培根密码
培根密码,培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b
密文形式是明显两个不同的字符。如大写字母和小写字母,英文和数字,斜体和正体。
例如
DEath IS JUST A PaRT oF lIFE,sOMeTHInG wE'RE aLL dESTInED TO dO.
是大写小写两个不同的字符
大写用a表示,小写用b表示
选取5个一组
DEath aabbb
ISJUS aaaaa
TAPaR aaaba
ToFlI ababa
FEsOM aabaa
eTHIn baaab
GwERE abaaa
aLLdE baaba
STInE aaaba
DTOdO aaab
按照上述的形式去在表里找对应得明文.
第一种方式
A aaaaa B aaaab C aaaba D aaabb
E aabaa F aabab G aabba H aabbb
I abaaa J abaab K ababa L ababb
M abbaa N abbab O abbba P abbbb
Q baaaa R baaab S baaba T baabb
U babaa V babab W babba X babbb
Y bbaaa Z bbaab第二种方式
a AAAAA g AABBA n ABBAA t BAABA
b AAAAB h AABBB o ABBAB u-v BAABB
c AAABA i-j ABAAA p ABBBA w BABAA
d AAABB k ABAAB q ABBBB x BABAB
e AABAA l ABABA r BAAAA y BABBA
f AABAB m ABABB s BAAAB z BABBB
培根密码在线解密
0x04 摩斯密码
摩尔斯电码是一种早期的数字化通信形式,但是它不同于现代只使用零和一两种状态的二进制代码,它的代码包括五种: 点、划、点和划之间的停顿、每个字符间短的停顿(在点和划之间)、每个词之间中等的停顿以及句子之间长的停顿。
形如:– — .-. … .
解密对照下图摩斯密码表:
在线摩斯密码解密
0x05 JsFuck
JSFuck 可以让你只用 6 个字符 !+ 来编写 JavaScript 程序。
形式:
[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+(!![]+[])+[[+!+[]]]][+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])()
其他一些基本的表达:
false => ![]
true => !![]
undefined => [][[]]
NaN => +[![]]
0 => +[]
1 => +!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => []["filter"]
eval => []["filter"]["constructor"]( CODE )()
window => []["filter"]["constructor"]("return this")()
可以使用firebug直接解密.
JsFuck在线解密
0x06 栅栏密码
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
例如
明文:THERE IS A CIPHER
去掉空格后变为:THEREISACIPHER
两个一组,得到:TH ER EI SA CI PH ER
先取出第一个字母:TEESCPE
再取出第二个字母:HRIAIHR
连在一起就是:TEESCPEHRIAIHR
还原为所需密码。
而解密的时候,我们先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
THEREISACIPHER
分出空格,就可以得到原文了:
THERE IS A CIPHER
例如密文:NlEyQd{seft}
N l
E y
Q d
{ s
e f
t }
NEQ{etIydsf}
python实现栅栏解密:zhalan.py
0x07 凯撒密码
它的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
##例如
当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。
解密参照凯撒密码表:
上述的密文:NEQ{etIydsf}
发现移位11
CTF{tianshu}
python实现凯撒解密:kaisa.py
0x08 维吉利亚密码
恺撒密码的基础上扩展的多表密码.
实例
如果你要对自己的男(女)神用维密(不是维多利亚的秘密)表白,先写好明文:I LOVE YOU
然后自己设定一个密钥,比如:KISS。
这样密钥与明文对应就是
K ISSK ISS
I LOVE YOU
对第一个字母“I”加密过程如下:
先找到最左侧密钥K所在的一行和最上方明文I所在列,找到他们的相交字母S,这样I就被加密成了S。
同理,这句话通过每一个对应密钥的加密后就变成如下
密钥:KISSKISS
明文:ILOVEYOU
密文:STGNOGGM
维吉利亚密码表:
0x09 Unicode编码
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。目前常用的有UTF-8、UTF-16、UTF-32。
密文形式:
\u5927\u5bb6\u597d\uff01\u000d\u000a
0x10 brainfuck编码
Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf*k,甚至被简称为BF。
共有八个字符
字符含义:
> 指针加一
< 指针减一
+ 指针指向的字节的值加一
- 指针指向的字节的值减一
. 输出指针指向的单元内容(ASCⅡ码)
, 输入内容到指针指向的单元(ASCⅡ码)
[ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处
密文形式:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
解密方法
使用brainfuck解释器解密
bftools.exe Decode braincopter doge.jpg -o dogeout.png
bftools.exe run dogeout.png
Q1RGe0JyYWluZnVja18xc19TaW1wMWV9
CTF{Brainfuck_1s_Simp1e}
- brainfuck在线解密
0x11 Playfair编码
Playfair密码出现于1854年,它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。
加密描述:
第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。
第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。
如:密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行
例如
首先playfair的加密过程用到一个5x5的字母矩阵,容纳26个字母,其中i和j挤到一个格子里,字母填写顺序取
决于密钥,The quick brown fox jumps over the lazy dog!既然出题者不是在讲故事,那,这句就是密钥了吧
将空格去掉,然后填入矩阵里,重复出现的字母只填一次。
填完后如下表:
t h e q u
i/j c k b r
o w n f x
m p s v l
a z y d g
填完密钥出现的字母后,若还有空余,就填字母表中剩余的字母(按字母表顺序)
加密过程:
把明文按两个字母一组分组,比如hello就分成he,lx,lo
相邻字母相同的情况下,中间加个填充字母x(有时候是q),若最后一个字母没组员,也加个填充字母。
加密规则:
1、两明文字母m1,m2同行,密文字母c1,c2在它们右边,同行循环,比如hu加密后是et;
2、m1,m2同列:c1,c2在它们下边,同列循环,hz加密后是ch;
3、m1,m2不同行列:c1,c2是m1,m2 组成的长方形的另两个顶点,顺序是c1与m1同行,c2与m2同行,cd加密后是bz;
解密过程:
有了密钥矩阵,将加密过程反过来就行。ihxo解密就是ctfx
ihxo{smzdodcikmodcismzd}
ctfx{playfairisfairplay}
0x12 urlcode编码
UrlEncode:将字符串以URL编码
返回值:字符串
函数种类:编码处理
形式:
%4d%54%45%35%43%6a%45%77%4d%51%6f%78%4d%44%67%4b%4f%54%6b%4b%4d%54%45%78%43%6a%45%77%4f%51%6f%78%4d%44%45%4b%4d%54%45%32%43%6a%45%78%4d%51%6f%78%4d%54%55%4b%4d%54%41%30%43%6a%45%77%4e%51%6f%78%4d%6a%45%4b%4f%54%63%4b%4d%54%45%77%43%6a%6b%34%43%6a%6b%33%43%6a%45%78%4e%41%3d%3d
urlcode在线解密
0x13 Serpent编码
Serpent(蟒蛇),它是AES的一个候选算法,该算法使用256位的密钥对128位的决数据进行加解密;
描述了Serpent的加解密过程及子密钥生成过程,同时对其性能作了部分阐述
Serpent在线解密
0x14 异或加密
异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
形式:
一般为一个二进制字符串和一个英文字母
解密过程
- 先把密钥转化成二进制
- 再和密文异或
异或解密算法:yihuo.py
0x15 CRC32加密
CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。
CRC是网络传输中经常用的一种校验方式。
其中CRC32则是采用这样的一个多项式生成式的CRC:
Xe32+Xe26+Xe23+Xe22+Xe16+Xe12+Xe11+Xe10 +Xe8+Xe7+Xe5+Xe4+Xe2+X+1
( string$str )
生成str的 32 位循环冗余校验码多项式。这通常用于检查传输的数据是否完整。
0x16 邮件编码
邮件编码即uuencode编码,是将二进制文件转换为文本文件的过程,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件进行uudecode,即将其转换为初始的二进制文件
形式:
MR,O)^KNYU>;*Q[*[P_?#Q+"AHZS6Q\G,LKNYNZ.LR;;2LK*[N^&CK+/VN/;,
MXK:\TJJ]RKZAQ-36K:&CH:,*M/.XQ;3PL+B^S<K'U>+1^;#)=V-T9GMU=75U
*=65N8V]D95]??0``
0x17 曼切斯特编码
曼彻斯特编码(Manchester Encoding),也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
从低到高跳变表示"0",从高到低跳变表示"1"。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。
即:
0-1 跳变表示 1,1-0 跳变表示 0
然而一般来说无线调制中,传感器和 RF 前端之前通信一般会采用 SPI 接口,而 SPI 接口有两种模式, MSB First 和 LSB First,一般在大多数情况下,都是 MSB First,可是这题不是,有点奇葩,这题是 LSB First