y
CTF密码学常见加密解密总结:
|
|
30余种加密编码类型的密文特征分析:
|
|
CTF中常见密码题解密网站总结:
|
|
三类的根本区别
| 大类 | 核心作用 | 是否通常可逆 | 是否需要秘密密钥 | 是否提供保密性 |
|---|---|---|---|---|
| 编码 | 改变数据的表示形式 | 是 | 否 | 否 |
| 古典密码 | 通过替换、移位、换位隐藏内容 | 是 | 有时需要 | 极弱 |
| 现代密码 | 依靠密钥和计算复杂性保护数据 | 加密可逆 | 是 | 正确使用时可以 |
Base16、Base32、Base64 等在标准中明确称为“数据编码”;AES 则被定义为对称分组密码;RSA 属于公钥密码。
一、编码
编码的基本过程是:
|
|
编码一般不使用秘密密钥。知道规则的人都可以解码,所以不能用来保护密码、令牌或敏感参数。
1. Base-N、进制与二进制到文本编码
1.1 有正式规范的 Base 编码
| 编码 | 严格分类 | 主要特点 |
|---|---|---|
| Base16 | 二进制到文本编码 | 即十六进制 Hex |
| Base32 | 二进制到文本编码 | 通常使用 A-Z、2-7 |
| Base64 | 二进制到文本编码 | 通常使用大小写字母、数字、+、/ |
| Base64url | Base64变体 | 使用 -、_ 替换 +、/ |
| Base45 | 二进制到文本编码 | 为二维码字母数字模式等场景设计 |
RFC 4648 规范了 Base16、Base32、Base64及Base64url字母表;RFC 9285定义了Base45。
Base16与Hex的关系
|
|
例如:
|
|
1.2 常见但存在多种实现的Base编码
| 编码 | 小类 | 注意事项 |
|---|---|---|
| Base36 | 进制表示/整数编码 | 通常使用 0-9A-Z |
| Base58 | 人类友好的Base编码 | 不同系统可能使用不同字母表 |
| Base62 | 进制表示/短字符串编码 | 字符顺序没有唯一标准 |
| Base85(a) | 通常指Ascii85 | 会使用较多标点 |
| Base85(b) | 通常指b85或Git风格Base85 | 与Ascii85字母表不同 |
| Base91 | 高密度二进制到文本编码 | 使用大量可打印符号 |
| Base92 | 工具型高密度编码 | 实现和字母表可能不同 |
| Base100 | Emoji编码 | 常把数据映射为Emoji |
Base36
Base36通常使用:
|
|
它更接近“把整数写成36进制”。至于如何把任意字节、中文或字符串转换成整数,各个工具可能不同。
Base58
Bitcoin风格Base58通常去掉容易混淆的字符:
|
|
也不使用:
|
|
但Bitcoin Base58、Ripple Base58等可能采用不同字母顺序,所以不能只看“都是58个字符”就认为完全兼容。
Base62
Base62一般使用:
|
|
但字母表可能是:
|
|
也可能是:
|
|
字符顺序不同,同一数据的结果也不同。
Base85(a)与Base85(b)
通常可理解为:
|
|
两者基本思想相似,但字母表、缩写规则、边界符号和填充处理不同,不能直接互相解码。
Base91、Base92、Base100
这些编码通常比Base64更偏向工具化或娱乐化:
- Base91:追求较高编码密度;
- Base92:不同实现可能存在差异;
- Base100:常用Emoji显示数据。
看到这些名称时,应同时记录具体工具、字母表和版本。
1.3 自定义Base编码
Base62编码/解码(ASCII)
这不是一个统一标准,通常表示工具采用了特殊的ASCII转换流程,例如:
|
|
也可能是逐字符转换、分组转换或把整个字节串作为大整数转换。
因此:
|
|
和:
|
|
可能使用完全不同的数据组织方式。
Base自定义编码表(key)
这里的 key 通常不是现代密码学密钥,而是一张有顺序的字符表。
例如标准Base16字母表:
|
|
自定义为:
|
|
之后,数值0就可能映射为 F,而不是 0。
严格分类是:
自定义字母表编码,或者固定替换混淆。
它没有现代加密的安全性。只要字母表被恢复,全部数据都可以解码。
2. 字符编码、转义与传输编码
2.1 Unicode
Unicode是通用字符编码标准。常见编码形式包括:
|
|
但下面这些写法不是“Unicode本身”:
|
|
它们分别属于HTML字符引用、编程语言转义和旧式Escape语法。Unicode标准负责定义字符及码点,HTML和URL则分别定义自己的字符引用与百分号编码语法。
2.2 HTML实体编码
包括:
|
|
可进一步分为:
| 类型 | 示例 |
|---|---|
| 命名字符引用 | < |
| 十进制数字字符引用 | 中 |
| 十六进制数字字符引用 | 中 |
它是HTML语法,不是加密。
2.3 \uXXXX Unicode转义
例如:
|
|
通常表示Unicode码点U+4E2D,也就是“中”。
常见于:
- JavaScript;
- JSON;
- Java;
- Python字符串;
- 配置文件。
它是转义表示,不是独立的字符编码,也不是密码。
对于基本多文种平面以外的字符,某些UTF-16环境可能使用两个代理项,例如:
|
|
2.4 Escape/Unescape与 %uXXXX
例如:
|
|
属于旧式JavaScript escape() 风格,和标准URL百分号编码不是一回事。
区别:
|
|
后者表示UTF-8字节:
|
|
2.5 URL百分号编码
基本形式:
|
|
其中 HH 是一个字节的两位十六进制表示。
例如:
|
|
所以URL编码和Hex都使用十六进制数字,但二者语法和应用场景不同。
2.6 Quoted-Printable
Quoted-Printable是MIME内容传输编码,常见于电子邮件。
典型形式:
|
|
它用:
|
|
表示某个字节,同时允许很多可打印ASCII字符保持原样。RFC 2045正式定义了Quoted-Printable。
它不限于中文,也不是加密。
2.7 莫尔斯电码
莫尔斯电码是通信代码,例如:
|
|
严格分类是:
字符到点划信号的编码系统。
它没有秘密密钥。只要知道码表,就可以直接还原,因此不属于古典密码。
3. 自定义文本、暗号和视觉编码
这些项目通常依赖某个网站或程序的固定映射规则。
3.1 与佛论禅
通常把原始文本映射成佛语风格字符。
严格分类可能是:
|
|
不同版本可能使用完全不同的实现,不能仅凭“都是佛语”认为能够互相解码。
3.2 百家姓暗号
通常用姓氏代表数字、字节、Hex字符或Base字符。
本质上属于:
|
|
除非码表本身秘密且随机,否则不具备可靠保密性。
3.3 文本加密为汉字/繁体字
通常是:
|
|
因此更准确的名称是:
汉字字母表编码。
末尾出现 = 往往意味着底层可能仍然沿用了Base64式填充规则。
3.4 Base100
虽然输出是Emoji,但原则仍然是固定映射:
|
|
所以属于视觉型二进制到文本编码,不属于隐写或现代密码。
4. JavaScript编码与代码混淆
4.1 AAEncode/颜文字JS
把JavaScript转换成大量颜文字及符号。
4.2 Jother
常利用:
|
|
构造字符串和JavaScript对象。
4.3 JSFuck
只使用:
|
|
构造任意JavaScript代码。
它们的严格分类是:
|
|
不是密码算法,也不提供可靠保密性。原文章列出的AAEncode、Jother和JSFuck都属于这一类。(腾讯云)
未知的AAEncode、Jother或JSFuck内容不应直接放进浏览器控制台执行,因为解码结果本身可能是恶意脚本。
5. 隐写类
隐写的目标主要是:
隐藏“存在一段秘密信息”这件事。
它和加密不同。加密通常让人看得出有密文,但不知道内容;隐写则试图让人看不出有秘密数据。
5.1 文本隐藏编码
把秘密信息藏在看似正常的文本中,例如加入不可见字符。
5.2 零宽字符隐写
可能使用:
|
|
肉眼看不到,但复制、删除或统计Unicode字符时可以发现异常。
5.3 Base64隐写
通常利用Base64末尾本应为零的填充位,或者利用换行、空白等细节藏信息。
它应归为:
|
|
而不是新的Base64加密算法。
6.
大小写随机Base64
标准Base64严格区分大小写。因此“大小写随机Base64解码”不属于标准Base64,通常是:
|
|
具体规则取决于该工具。
Base64解压缩解码
这是组合处理:
|
|
混合多重解码与BaseCrack
例如:
|
|
需要按照相反顺序:
|
|
自动工具只能生成候选路径,仍要通过重新编码、文件头、UTF-8合法性和上下文验证。
二、古典密码
古典密码主要依赖:
|
|
它们通常没有现代密码所要求的巨大密钥空间和抗攻击能力。
1. 单表替换与移位密码
1.1 凯撒密码
所有字母使用相同偏移量:
|
|
例如偏移3:
|
|
凯撒密码是ROT系列的基本形式。
1.2 ROT13
对英文字母旋转13位:
|
|
因为:
|
|
所以执行两次就恢复原文。
1.3 ROT5
只处理数字:
|
|
执行两次恢复原文。
1.4 ROT18
ROT18通常是组合算法:
|
|
名称来自:
|
|
它并不是把所有字符统一移动18位。
1.5 ROT47
处理可打印ASCII字符,通常是ASCII 33到126,共94个字符。
由于:
|
|
执行两次也能恢复原文。
与ROT13相比,ROT47还会改变数字和标点。
1.6 ROT8000
ROT8000是Unicode环境中的现代趣味轮转,但从结构上仍然属于:
古典移位/固定替换思想的Unicode扩展。
它可能把普通英文变成生僻汉字、日韩文字或Unicode符号。
它不是历史上的古典密码,但算法结构与凯撒移位相同,所以放入古典密码的“现代扩展”小类最合适。
1.7 ROT Special
ROT Special没有统一标准。
常见实现可能采用:
- 第1个字符移动1位;
- 第2个字符移动2位;
- 第3个字符移动3位;
- 位移量循环;
- 数字和字母采用不同规则;
- 每行重新计数。
因此它应归类为:
|
|
必须知道具体工具规则才能可靠解密。
2. 多表替换密码
2.1 维吉尼亚密码
维吉尼亚密码根据重复密钥,为不同位置选择不同的凯撒位移。
例如:
|
|
可以抽象为:
|
|
它比单一凯撒密码复杂,但仍可通过密钥长度分析、频率分析等方式破解。
3. 符号替换密码
3.1 猪圈密码
猪圈密码使用格子、点和几何符号代替字母。
严格分类是:
|
|
它只是把字母换成符号,字母频率和重复结构仍会保留,因此安全性很低。文章也将其描述为格子式简单替代密码。(腾讯云)
4. 换位密码
换位密码通常不改变字符本身,而是改变字符排列顺序。
4.1 栅栏密码基础型
例如把文本分组或排成若干行,再按列读取。
其本质是:
|
|
4.2 W型栅栏密码
把明文按锯齿形路径排列:
|
|
然后逐行读取。
它也叫Rail Fence Cipher的锯齿型实现。
4.3 卡尔达诺栅格码
通过带孔栅格选取或放置字符。
严格分类可以是:
|
|
5. 不应归入古典密码的项目
| 项目 | 正确分类 |
|---|---|
| 莫尔斯电码 | 通信编码 |
| 百家姓暗号 | 自定义码表编码/替换混淆 |
| 与佛论禅 | 工具型自定义编码或组合处理 |
| 文本转汉字 | 自定义文本编码 |
| Base64 | 二进制到文本编码 |
| 零宽字符 | 隐写 |
| JSFuck | JavaScript混淆 |
三、现代密码
现代密码依赖严格定义的算法、密钥和计算安全性。
现代密码部分可进一步分为:
|
|
1. 对称密码
对称密码的加密和解密使用相同密钥,或者使用可以直接相互推导的密钥。
|
|
1.1 对称分组密码
| 算法 | 分类 | 当前定位 |
|---|---|---|
| DES | 对称分组密码 | 已淘汰 |
| Triple DES/3DES/TDEA | 对称分组密码 | 仅适合处理历史数据 |
| AES | 对称分组密码 | 现代主流基础算法 |
AES
AES是对称分组密码:
- 分组长度:128位;
- 密钥长度:128、192或256位。
AES只是基础分组算法,实际还要配合工作模式,例如:
|
|
DES
DES也是对称分组密码,但有效密钥空间太小,已经不适合现代安全用途。NIST在2005年撤销了DES标准。
3DES/Triple DES/TDEA
3DES对DES操作执行多次,曾用于延长DES寿命。
NIST已于2024年撤销TDEA用于施加新的密码保护;它只保留在解密、解包或验证部分既有历史数据的场景中。
1.2 对称流密码
| 算法 | 分类 | 当前定位 |
|---|---|---|
| RC4 | 对称流密码 | 已淘汰 |
| Rabbit | 对称流密码 | 较少见的历史算法 |
RC4
RC4生成伪随机密钥流,并与明文进行异或:
|
|
由于存在严重安全问题,RC4已经被禁止用于TLS。
Rabbit
Rabbit也是流密码,使用128位密钥和64位初始化向量。RFC 4503对其算法进行了描述。
2. 非对称密码
2.1 公钥加密与密钥传输
| 类型 | 代表 |
|---|---|
| RSA公钥密码 | RSA-OAEP |
| 离散对数公钥密码 | ElGamal |
| 椭圆曲线混合加密 | ECIES类方案 |
需要避免直接使用“裸RSA”:
|
|
现代应用应使用安全填充或封装方案,例如:
|
|
2.2 密钥协商
代表:
|
|
这些机制通常不是直接加密消息,而是让通信双方计算出相同共享密钥,再使用AES等对称密码加密大量数据。
代表:
|
|
数字签名解决的是:
- 谁签署了数据;
- 数据是否被篡改;
- 签名者能否否认。
3. 密码学哈希函数
哈希函数执行:
|
|
3.1 MD系列
|
|
其中MD5通常输出128位摘要,即:
|
|
3.2 SHA-1
|
|
输出160位摘要,通常显示为40个十六进制字符。
3.3 SHA-2系列
|
|
注意:
|
|
不是简单截取SHA-512前256位,而是使用不同初始化值定义的独立SHA-2变体。
3.4 SHA-3系列
|
|
SHA-3基于Keccak结构,与SHA-2内部结构不同。
3.5 RIPEMD系列
文章出现:
|
|
它们都属于密码学哈希函数,数字表示摘要位数。
3.6 HAVAL系列
|
|
其中:
- 第一个数字表示摘要位数;
- 最后的3、4、5表示轮数。
均属于密码学哈希,不是加密。
3.7 Tiger系列
|
|
其中128、160、192表示输出位数;3、4通常表示处理轮数。
3.8 其他密码学哈希
|
|
4. 消息认证码
HMAC
HMAC的完整名称是:
|
|
其输入通常包括:
|
|
输出是认证标签。
HMAC主要验证:
- 消息是否被修改;
- 消息是否来自持有共享密钥的一方。
它不能隐藏消息,也不能从HMAC值恢复原文。
常见实例:
|
|
5. 口令摘要与验证格式
5.1 NTLM
NTLM口令摘要属于Windows口令验证体系。
严格分类:
|
|
5.2 Domain Cached Credentials
又常见为:
|
|
用于Windows域环境中的缓存凭据验证。
它属于口令派生验证值,不是可正常解密的密文。
5.3 MySQL旧口令摘要
|
|
通常指旧MySQL口令摘要算法。
5.4 MySQL 5口令摘要
|
|
通常指MySQL较新版本曾使用的SHA-1相关口令验证格式。
这几项都应归入:
|
|
不应简单叫做“可解密密码”。
6. 非密码学哈希与校验和
6.1 Adler-32
|
|
属于校验和,用于检测传输或存储错误。
6.2 CRC系列
|
|
属于循环冗余校验。
用途主要是:
|
|
6.3 FNV系列
|
|
FNV是快速的非密码学哈希,适合散列表、标识符和普通数据分散,不适合密码、签名或防篡改。
6.4 JOAAT
|
|
通常指Jenkins One-at-a-Time Hash。
它属于快速非密码学哈希。