CTF-Crypto
出题思路:区块链、公钥RSA、流密码、分组密码
机密性(加密算法)、完整性(消息摘要)、可用性、认证性(认证签名)、不可否认性、
-
编码基础|HEX:a-f 0-9,考虑ascii解码
-
编码基础|Base64:A-W a-w 0-9 + / 共64个字符使用4字符表达3字节,不足用0替换,也即是=
import base64 str = "解密字符串" //将数字用!@#等替换 basestr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" newstr = '' table = ')!@#$%^&*(' for i in str: if i not in table: newstr=newstr + i else newstr=newstr+(table.index(i)) import base64 print(base.b64decode(newstr))
-
编码基础|古典密码学:单表代换加密–爆破和词频分析
- 凯撒密码:向前或后移动若干位。特定凯撒密码名–偏移量10 Avocat、偏移量13 ROT13、偏移量-5 Cassis、偏移量-6 Cassette
- 摩斯密码:点线
- 键盘密码:用手机九宫格或键盘位置加密
- 猪圈密码:以格子为基础的替换密码
- 培根密码:使用两种不同字体代表AB结合加密表加密
- 栅栏密码:要加密明文分成N个一组,然后每组第一个字相连
- 曲路密码:明文划分为矩阵
- 维吉尼亚密码:使用多表替换,同凯撒,利用重合性字频分析爆破
- Polybius、BrainFuck、与佛论禅、社会主义核心价值观编码、Ook!、云影密码(01246)、JsFuck(()[]!+)、圣堂武士密码、夏多密码(曲折加密)、跳舞的小人密码、
-
编码基础|仿射密码:一小串字母数字,有2个以上重复字母
加密函数:E(x) = (ax + b) (mod m),其中 a与b互质,m是编码系统中字母的个数(通常都是26)。
解密函数:D(x) = a^-1(x-b)(mod m),a的逆元可以用pow(a,-1,m)求出,
-
异或加密|OTP一次性密码本:key长度大于message,一次性key
-
现代密码|哈希函数:散列算法,单向性、固定长度、雪崩效应—MD5 16字节
flag = 'd0g3{' + hashlib.md5(SECRET).hexdigest() + '}' broken_flag = 'd0g3{71b2b5616**2a4639**7d979**de964c}' assert flag[:14] == broken_flag[:14] assert flag[16:22] == broken_flag[16:22] assert flag[24:29] == broken_flag[24:29] ciphier = hashlib.sha256(flag).hexdigest() print(ciphier) '''ciphier = '0596d989a2938e16bcc5d6f89ce709ad9f64d36316ab80408cb6b89b3d7f064a''' //多线程爆破hash串 #!/usr/bin/python from pwn import pwnlib from pwnlib.util.iters import mbruteforce import hashlib # flag = 'd0g3{71b2b5616**2a4639**7d979**de964c}' msgbroken = 'd0g3{71b2b5616**2a4639**7d979**de964c}' table = '0123456789abcdef' assert len(table) ==16 m1 = 'd0g3{71b2b5616' m2='2a4639' m3='7d979' m4='de964c}' def f(res): ciphier = '0596d989a2938e16bcc5d6f89ce709ad9f64d36316ab80408cb6b89b3d7f064a' msgbroken = m1+res[0:2]+m2+res[2:4]+m3+res[4:6]+m4 tmp = hashlib.sha256(msgbroken.encode("utf-8")).hexdigest() if tmp ==ciphier: return True if __name__ == "__main__": res = mbruteforce(f,table,6,method='fixed') print(m1+res[0:2]+m2+res[2: