识别常见加密算法特征,包括Tea系列、AES、SHA1、BlowFish、SM4、RC4、DES、Base58、Base64和Hex编码等,并介绍其加密解密方法。
AI 摘要
Tea 系列
tea 系列加密可谓常见,甚至腾讯都在魔改 tea 使用到数据加密中。
Tea 系列加密都会有个叫 Delta 的东西,其常见值为 0x9E3779B9或0x61C88647
,这个东西是可以被随意改变的,但是如果见得这串熟悉的数据,那就基本可以确定是 tea 系列加密了
Tea
普通 tea 可以被攻击 (别问怎么攻击,我也不知道)
每次加密处理 64 位数据,并且被分别两组
- 明显的两行进行一堆位运算和异或后与明文相加减
- Dword [2] 或者两个 Dword 进行操作,
- 循环 32 次,但是这个次数是魔改的
- 移位通常是左移 4,右移 5,这个也是可以魔改的
- Key 是 4 个 32 位的值,与移位后数据相加
XTEA/TEAN
可以被攻击,特征与 TEA 相似,但还比 tea 多一个特征
- 对 Delta 的和进行 & 3 来选取密钥
XXTEA
最厉害的 tea 类型加密,加密逻辑比较复杂,不像上面两个看两眼就能写解密代码,同时原字符串长度可以不是 4 的倍数了,特征和上面两个也很不一样
- 128 位的 key (和上面两个一样)
- 很多的 & 3 操作,会和 key 和 sum 进行运算
- 嵌套循环
- 可能会在同一行里出现左移 2 或 4,右移 3 或 5 (你就记 2345 吧)
- rounds = 6 + 52/n, 会出现被除数 52 和 + 6
AES 加密
AES 为对称加密,同时也是分组加密,每组处理 128 位数据 (16 个字节),按密钥长度分为 AES128 (16 字节密钥 10 轮加密),AES192 (24 字节密钥 12 轮加密),AES256 (32 字节密钥 14 轮加密)。
- 对明文长度进行除 16,或者右移 4 位
- 左移右移 24/16/8 或者 & ff000000,&00ff0000,&0000ff00,&000000ff
- 256 个元素的数组 (16x16 的 Sbox),如加密盒子 {0x63,0x7c,0x77,0x7b...} 解密盒子 {0x52,0x09,0x6a,0xd5...}, 可能出现换盒
- 一行代码里对数组 4 个元素操作 (看起来很整齐,元素下标有顺序)
加密可以魔改,subbytes 和 shiftrows 顺序调换是没关系的,但是 MixColums 顺序加密放最前面解密就要放最后面
逆盒算法:
new_s_box = [,,,,,]
new_contrary_sbox = [0]*256
for i in range(256):
line = (new_s_box[i]&0xf0)>>4
rol = new_s_box[i]&0xf
new_contrary_sbox[(line*16)+rol] = i
print(new_contrary_sbox)
sha1
不安全的加密算法,不可逆
- 一般有 5 个 IV 0x67452301;0xEFCDAB89;0x98BADCFE;0x10325476;0xC3D2E1F0 (前四个和 md 的 iv 相同)
BlowFish
两个盒用来加密
- PBOX (18 个 32 位子密钥)
- SBOX (4 组 8*32 位数组 Sbox [4][256])
- 18 轮循环里套 4 轮循环,4 轮循环里套 256 (步长为 2) 轮循环
sm4 (国密)
分组加密,和 AES 特征很像。
- 256 个元素的 SBOX
- 128 位分组,密钥也是 128 位 (16 字节)
- 移位 8,16,24 再 & ff
- 一行代码里对数组 4 个元素操作 (看起来很整齐,元素下标有顺序)
rc4 加密
加密解密是同一套算法
- 一个 256 位的 sbox
- 进行变量数值交换操作 (swap)
- 多次取余 256
- 一个单独的异或操作
DES 加密
主要加密特征是一堆表
- 64 位 (8 字符) 或 192 位 (24 字符) 的 key
- 16 个元素的移位数组
- 32 个元素的换位表
- 48 个元素选位表
- 56 个元素的选位数组
- 64 个元素的置换表
- 8x4x16 (512) 个元素的 sbox
base58
和普通 base 加密有很大不同,通过取模进行加密
- 进行 %58 和 / 58 的操作
base64
普遍的加密
- 有 '=' 或 61 存在
- 64 个元素的可打印字符表
- 加密可能有 & FC,&F0,&C0 操作
- 解密可能有 & 0x30,&3C 操作
hex 编码
- 进行 & 0xFFFFFFB5 | 8
- +0x30 或 +'0' 或 + 48
CRC
- &1
- +0x30 或 +'0' 或 + 48