CTF-Crypto密码学
关于CTF
CTF(Capture The Flag),即夺旗赛。在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容(Flag),并将其提交给主办方,从而夺得分数。
CTF竞赛模式具体分为以下三类:
解题模式
通过互联网或现场网络参与,解决网络安全技术挑战题目,并以分值和时间排名。
攻防模式
在攻防(AWD)模式CTF赛制中,在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手来得分,修补自身服务漏洞进行防御来避免丢分。
混合模式
结合了解题模式与攻防模式的CTF赛制,参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最终以得分高低分出胜负。
赛题类型一般分为Web 渗透、Crypto 密码学、Pwn 二进制、Reverse 逆向、Misc 杂项,拓展的还有Mobile 移动设备, Forensics 电子取证等,这些其实都可以归入前面五大类中。
Crypto
编码
ASCII

Base64\Base32\Base16编码
常见的base系列编码有base64、base32、base16,其中
base64:含az,AZ,0~9,+,/ 以及补位的 ‘’=’’;(补齐字符串长度为4的倍数)
base32:含AZ,27以及补位的 ‘’=’’;(补齐字符串长度为8的倍数,可以不添加)
base16:含09,AF。
注意换表
参考:https://www.qqxiuzi.cn/bianma/base.php
Unicode编码
特征是以\u数字或者字母加数字,\u过后是每四个为一组。可以使用python的print函数输出。
URL编码
url编码又叫百分号编码,是统一资源定位(URL)编码方式。其形式为%加上十六进制数值。
HTML实体编码
一些字符在 HTML 中是预留的,拥有特殊的含义,比如小于号‘<’用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。
http://www.w3school.com.cn/html/html_entities.asp
莫尔斯电码和敲击码
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。它的代码包括五种:点、划、点和划之间的停顿、每个字符之间短的停顿、每个词之间中等的停顿以及句子之间长的停顿。
除此之外,常用的编码方式还有敲击码(Tap code)等。
JSFuck
JSFuck也称为Jother编码,是JavaScript的一种变形编码,因此可以使用浏览器控制台输出。其源于一门编程语言Brainfuck,主要的思想就是只使用8种特定的符号来编写代码。而JSFuck也是沿用了这个思想,它仅仅使用6种符号来编写代码。它们分别是**(、)、+、[、]、!**。
http://www.liminba.com/tool/jsfuckdecode/
Brainfuck
Brainfuck是一种极小化的计算机语言,目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。BrainFuck 语言只有八种符号,所有的操作都由这八种符号(**> < + - . , [ ]** )的组合来完成。
https://www.splitbrain.org/services/ook
古典密码
恺撒密码
恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数值进行偏移,替换成密文。
1 | |
栅栏密码
栅栏密码就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。
1 | |
培根密码
又名倍康尼密码(英语:Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术。是一种替换密码,每个明文字母被一组五个英文字母的序列替换。如下表

加密者需使用两种不同格式或属性,分别代表A和B。准备好一篇包含相同AB字数的假信息后,按照密文格式化假信息,即依密文中每个字母是A还是B分别套用两种格式或属性。
1 | |
仿射密码
仿射密码是一种单表代换密码,字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母。每一个字母都是通过函数(ax + b)mod m加密,其中b是位移量,为了保证仿射密码的可逆性,a和m需要互质,一般m为设置为26。
维吉尼亚密码
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。

1 | |
https://www.qqxiuzi.cn/bianma/weijiniyamima.php
对称密码
AES、DES、RC4、Rabbit、3DES加密
RC4加密过程:
- 生成伪随机数组S:长度为256,填充所有元素从0到255;
- 初始化状态向量:将数组S中的元素按照指定的密钥K进行一次打乱;
- 产生密钥流:从位置0开始,每次取出S中的一个元素,然后将其与前一个元素进行交换,并取出交换后的元素;
- 加密过程:将明文每一个字节和密钥流中的一个字节进行异或运算,得到密文。
RC4解密过程:
根据密钥K,生成相同的伪随机数组S;
初始化状态向量,将数组S中的元素按照密钥K进行一次打乱;
从位置0开始,每次取出S中的一个元素,并与前一个元素进行交换,取出交换后的元素;
解密过程:将密文每一个字节和密钥流中的一个字节进行异或运算,得到明文。
1
2
3
4
5
6
7# RC4解密函数
def rc4_decrypt(data, key):
key = bytes(key, encoding="utf-8")
enc = ARC4.new(key)
res = enc.decrypt(data)
res = str(res,"utf-8")
return res
非对称密码
RSA、 DSA、 DH 和 ECC加密
哈希摘要算法
1 | |