加密编码类型的密文特征分析基本渗透测试命令

y

CTF密码学常见加密解密总结:

1
https://blog.csdn.net/qq_40837276/article/details/83080460

30余种加密编码类型的密文特征分析:

1
https://mp.weixin.qq.com/s?__biz=MzAwNDcxMjI2MA==&mid=2247484455&idx=1&sn=e1b4324ddcf7d6123be30d9a5613e17b&chksm=9b26f60cac517f1a920cf3b73b3212a645aeef78882c47957b9f3c2135cb7ce051c73fe77bb2&mpshare=1&scene=23&srcid=1111auAYWmr1N0NAs9Wp2hGz&sharer_sharetime=1605145141579&sharer_shareid=5051b3eddbbe2cb698aedf9452370026#rd

CTF中常见密码题解密网站总结:

1
https://blog.csdn.net/qq_41638851/article/details/100526839

三类的根本区别

大类 核心作用 是否通常可逆 是否需要秘密密钥 是否提供保密性
编码 改变数据的表示形式
古典密码 通过替换、移位、换位隐藏内容 有时需要 极弱
现代密码 依靠密钥和计算复杂性保护数据 加密可逆 正确使用时可以

Base16、Base32、Base64 等在标准中明确称为“数据编码”;AES 则被定义为对称分组密码;RSA 属于公钥密码。


一、编码

编码的基本过程是:

1
原始字节 → 按规则映射 → 可打印字符串

编码一般不使用秘密密钥。知道规则的人都可以解码,所以不能用来保护密码、令牌或敏感参数。


1. Base-N、进制与二进制到文本编码

1.1 有正式规范的 Base 编码

编码 严格分类 主要特点
Base16 二进制到文本编码 即十六进制 Hex
Base32 二进制到文本编码 通常使用 A-Z2-7
Base64 二进制到文本编码 通常使用大小写字母、数字、+/
Base64url Base64变体 使用 -_ 替换 +/
Base45 二进制到文本编码 为二维码字母数字模式等场景设计

RFC 4648 规范了 Base16、Base32、Base64及Base64url字母表;RFC 9285定义了Base45。

Base16与Hex的关系

1
Base16 = Hex = 十六进制字节表示

例如:

1
2
3
4
5
Hello
↓ UTF-8字节
48 65 6C 6C 6F
↓ Base16
48656C6C6F

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通常使用:

1
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

它更接近“把整数写成36进制”。至于如何把任意字节、中文或字符串转换成整数,各个工具可能不同。

Base58

Bitcoin风格Base58通常去掉容易混淆的字符:

1
0 O I l

也不使用:

1
+ / =

但Bitcoin Base58、Ripple Base58等可能采用不同字母顺序,所以不能只看“都是58个字符”就认为完全兼容。

Base62

Base62一般使用:

1
2
3
0-9
A-Z
a-z

但字母表可能是:

1
0-9 A-Z a-z

也可能是:

1
0-9 a-z A-Z

字符顺序不同,同一数据的结果也不同。

Base85(a)与Base85(b)

通常可理解为:

1
2
Base85(a) ≈ Ascii85
Base85(b) ≈ b85 / Git风格Base85

两者基本思想相似,但字母表、缩写规则、边界符号和填充处理不同,不能直接互相解码。

Base91、Base92、Base100

这些编码通常比Base64更偏向工具化或娱乐化:

  • Base91:追求较高编码密度;
  • Base92:不同实现可能存在差异;
  • Base100:常用Emoji显示数据。

看到这些名称时,应同时记录具体工具、字母表和版本


1.3 自定义Base编码

Base62编码/解码(ASCII)

这不是一个统一标准,通常表示工具采用了特殊的ASCII转换流程,例如:

1
2
3
字符
→ ASCII数值
→ Base62表示

也可能是逐字符转换、分组转换或把整个字节串作为大整数转换。

因此:

1
Base62

和:

1
Base62 ASCII

可能使用完全不同的数据组织方式。

Base自定义编码表(key)

这里的 key 通常不是现代密码学密钥,而是一张有顺序的字符表。

例如标准Base16字母表:

1
0123456789ABCDEF

自定义为:

1
FEDCBA9876543210

之后,数值0就可能映射为 F,而不是 0

严格分类是:

自定义字母表编码,或者固定替换混淆。

它没有现代加密的安全性。只要字母表被恢复,全部数据都可以解码。


2. 字符编码、转义与传输编码

2.1 Unicode

Unicode是通用字符编码标准。常见编码形式包括:

1
2
3
UTF-8
UTF-16
UTF-32

但下面这些写法不是“Unicode本身”:

1
2
3
4
中
中
\u4E2D
%u4E2D

它们分别属于HTML字符引用、编程语言转义和旧式Escape语法。Unicode标准负责定义字符及码点,HTML和URL则分别定义自己的字符引用与百分号编码语法。


2.2 HTML实体编码

包括:

1
2
3
4
5
<
>
&
中
中

可进一步分为:

类型 示例
命名字符引用 <
十进制数字字符引用
十六进制数字字符引用

它是HTML语法,不是加密。


2.3 \uXXXX Unicode转义

例如:

1
\u4E2D

通常表示Unicode码点U+4E2D,也就是“中”。

常见于:

  • JavaScript;
  • JSON;
  • Java;
  • Python字符串;
  • 配置文件。

它是转义表示,不是独立的字符编码,也不是密码。

对于基本多文种平面以外的字符,某些UTF-16环境可能使用两个代理项,例如:

1
\uD83D\uDE00

2.4 Escape/Unescape与 %uXXXX

例如:

1
%u4E2D

属于旧式JavaScript escape() 风格,和标准URL百分号编码不是一回事。

区别:

1
2
旧式Escape:%u4E2D
URL百分号编码:%E4%B8%AD

后者表示UTF-8字节:

1
E4 B8 AD

2.5 URL百分号编码

基本形式:

1
%HH

其中 HH 是一个字节的两位十六进制表示。

例如:

1
2
3
4
5
中文“中”
↓ UTF-8
E4 B8 AD
↓ URL百分号编码
%E4%B8%AD

所以URL编码和Hex都使用十六进制数字,但二者语法和应用场景不同。


2.6 Quoted-Printable

Quoted-Printable是MIME内容传输编码,常见于电子邮件。

典型形式:

1
=E4=B8=AD

它用:

1
=HH

表示某个字节,同时允许很多可打印ASCII字符保持原样。RFC 2045正式定义了Quoted-Printable。

它不限于中文,也不是加密。


2.7 莫尔斯电码

莫尔斯电码是通信代码,例如:

1
2
A → .-
B → -...

严格分类是:

字符到点划信号的编码系统。

它没有秘密密钥。只要知道码表,就可以直接还原,因此不属于古典密码。


3. 自定义文本、暗号和视觉编码

这些项目通常依赖某个网站或程序的固定映射规则。

3.1 与佛论禅

通常把原始文本映射成佛语风格字符。

严格分类可能是:

1
2
3
自定义编码
编码 + 对称加密的组合工具

不同版本可能使用完全不同的实现,不能仅凭“都是佛语”认为能够互相解码。


3.2 百家姓暗号

通常用姓氏代表数字、字节、Hex字符或Base字符。

本质上属于:

1
2
3
固定码表编码
替换式混淆

除非码表本身秘密且随机,否则不具备可靠保密性。


3.3 文本加密为汉字/繁体字

通常是:

1
2
3
原始字节
→ Base类编码或自定义数字
→ 汉字码表替换

因此更准确的名称是:

汉字字母表编码。

末尾出现 = 往往意味着底层可能仍然沿用了Base64式填充规则。


3.4 Base100

虽然输出是Emoji,但原则仍然是固定映射:

1
字节或数值 → Emoji

所以属于视觉型二进制到文本编码,不属于隐写或现代密码。


4. JavaScript编码与代码混淆

4.1 AAEncode/颜文字JS

把JavaScript转换成大量颜文字及符号。

4.2 Jother

常利用:

1
! + ( ) [ ] { }

构造字符串和JavaScript对象。

4.3 JSFuck

只使用:

1
[ ] ( ) ! +

构造任意JavaScript代码。

它们的严格分类是:

1
2
3
程序变换
代码混淆
特殊字符编码

不是密码算法,也不提供可靠保密性。原文章列出的AAEncode、Jother和JSFuck都属于这一类。(腾讯云)

未知的AAEncode、Jother或JSFuck内容不应直接放进浏览器控制台执行,因为解码结果本身可能是恶意脚本。


5. 隐写类

隐写的目标主要是:

隐藏“存在一段秘密信息”这件事。

它和加密不同。加密通常让人看得出有密文,但不知道内容;隐写则试图让人看不出有秘密数据。

5.1 文本隐藏编码

把秘密信息藏在看似正常的文本中,例如加入不可见字符。

5.2 零宽字符隐写

可能使用:

1
2
3
4
U+200B 零宽空格
U+200C 零宽非连接符
U+200D 零宽连接符
U+2060 单词连接符

肉眼看不到,但复制、删除或统计Unicode字符时可以发现异常。

5.3 Base64隐写

通常利用Base64末尾本应为零的填充位,或者利用换行、空白等细节藏信息。

它应归为:

1
以Base64为载体的隐写

而不是新的Base64加密算法。


6.

大小写随机Base64

标准Base64严格区分大小写。因此“大小写随机Base64解码”不属于标准Base64,通常是:

1
2
3
枚举大小写组合
→ 尝试Base64解码
→ 筛选可读结果

具体规则取决于该工具。

Base64解压缩解码

这是组合处理:

1
2
3
4
Base64解码
→ 得到二进制
→ 识别gzip/zlib/ZIP
→ 解压

混合多重解码与BaseCrack

例如:

1
Base16(Base32(Base64(明文)))

需要按照相反顺序:

1
2
3
4
Base16解码
→ Base32解码
→ Base64解码
→ 明文

自动工具只能生成候选路径,仍要通过重新编码、文件头、UTF-8合法性和上下文验证。


二、古典密码

古典密码主要依赖:

1
2
3
4
字符替换
字母移位
字符位置重排
固定符号码表

它们通常没有现代密码所要求的巨大密钥空间和抗攻击能力。


1. 单表替换与移位密码

1.1 凯撒密码

所有字母使用相同偏移量:

1
2
加密:C = (P + k) mod 26
解密:P = (C - k) mod 26

例如偏移3:

1
2
3
A → D
B → E
Z → C

凯撒密码是ROT系列的基本形式。


1.2 ROT13

对英文字母旋转13位:

1
2
A ↔ N
B ↔ O

因为:

1
13 + 13 = 26

所以执行两次就恢复原文。


1.3 ROT5

只处理数字:

1
2
3
4
5
0 ↔ 5
1 ↔ 6
2 ↔ 7
3 ↔ 8
4 ↔ 9

执行两次恢复原文。


1.4 ROT18

ROT18通常是组合算法:

1
2
字母:ROT13
数字:ROT5

名称来自:

1
13 + 5 = 18

它并不是把所有字符统一移动18位。


1.5 ROT47

处理可打印ASCII字符,通常是ASCII 33到126,共94个字符。

由于:

1
94 ÷ 2 = 47

执行两次也能恢复原文。

与ROT13相比,ROT47还会改变数字和标点。


1.6 ROT8000

ROT8000是Unicode环境中的现代趣味轮转,但从结构上仍然属于:

古典移位/固定替换思想的Unicode扩展。

它可能把普通英文变成生僻汉字、日韩文字或Unicode符号。

它不是历史上的古典密码,但算法结构与凯撒移位相同,所以放入古典密码的“现代扩展”小类最合适。


1.7 ROT Special

ROT Special没有统一标准。

常见实现可能采用:

  • 第1个字符移动1位;
  • 第2个字符移动2位;
  • 第3个字符移动3位;
  • 位移量循环;
  • 数字和字母采用不同规则;
  • 每行重新计数。

因此它应归类为:

1
2
3
自定义移位密码
位置相关替换密码

必须知道具体工具规则才能可靠解密。


2. 多表替换密码

2.1 维吉尼亚密码

维吉尼亚密码根据重复密钥,为不同位置选择不同的凯撒位移。

例如:

1
2
明文:ATTACKATDAWN
密钥:LEMONLEMONLE

可以抽象为:

1
Ci = (Pi + Ki) mod 26

它比单一凯撒密码复杂,但仍可通过密钥长度分析、频率分析等方式破解。


3. 符号替换密码

3.1 猪圈密码

猪圈密码使用格子、点和几何符号代替字母。

严格分类是:

1
单表替换密码

它只是把字母换成符号,字母频率和重复结构仍会保留,因此安全性很低。文章也将其描述为格子式简单替代密码。(腾讯云)


4. 换位密码

换位密码通常不改变字符本身,而是改变字符排列顺序。

4.1 栅栏密码基础型

例如把文本分组或排成若干行,再按列读取。

其本质是:

1
2
明文字符不变
字符位置重新排列

4.2 W型栅栏密码

把明文按锯齿形路径排列:

1
2
3
第1行  ●       ●       ●
第2行    ●   ●   ●   ●
第3行      ●       ●

然后逐行读取。

它也叫Rail Fence Cipher的锯齿型实现。


4.3 卡尔达诺栅格码

通过带孔栅格选取或放置字符。

严格分类可以是:

1
2
3
古典换位密码
+
栅格隐写

5. 不应归入古典密码的项目

项目 正确分类
莫尔斯电码 通信编码
百家姓暗号 自定义码表编码/替换混淆
与佛论禅 工具型自定义编码或组合处理
文本转汉字 自定义文本编码
Base64 二进制到文本编码
零宽字符 隐写
JSFuck JavaScript混淆

三、现代密码

现代密码依赖严格定义的算法、密钥和计算安全性。

现代密码部分可进一步分为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
现代密码
├─ 对称密码
│  ├─ 分组密码
│  └─ 流密码
├─ 非对称密码
│  ├─ 公钥加密/密钥封装
│  ├─ 密钥协商
│  └─ 数字签名
└─ 相关密码学机制
   ├─ 哈希
   ├─ MAC
   ├─ 口令验证算法
   └─ 非密码学校验

1. 对称密码

对称密码的加密和解密使用相同密钥,或者使用可以直接相互推导的密钥。

1
2
密钥K + 明文 → 密文
密钥K + 密文 → 明文

1.1 对称分组密码

算法 分类 当前定位
DES 对称分组密码 已淘汰
Triple DES/3DES/TDEA 对称分组密码 仅适合处理历史数据
AES 对称分组密码 现代主流基础算法

AES

AES是对称分组密码:

  • 分组长度:128位;
  • 密钥长度:128、192或256位。

AES只是基础分组算法,实际还要配合工作模式,例如:

1
2
3
CBC
CTR
GCM

DES

DES也是对称分组密码,但有效密钥空间太小,已经不适合现代安全用途。NIST在2005年撤销了DES标准。

3DES/Triple DES/TDEA

3DES对DES操作执行多次,曾用于延长DES寿命。

NIST已于2024年撤销TDEA用于施加新的密码保护;它只保留在解密、解包或验证部分既有历史数据的场景中。


1.2 对称流密码

算法 分类 当前定位
RC4 对称流密码 已淘汰
Rabbit 对称流密码 较少见的历史算法

RC4

RC4生成伪随机密钥流,并与明文进行异或:

1
明文 XOR 密钥流 = 密文

由于存在严重安全问题,RC4已经被禁止用于TLS。

Rabbit

Rabbit也是流密码,使用128位密钥和64位初始化向量。RFC 4503对其算法进行了描述。


2. 非对称密码

2.1 公钥加密与密钥传输

类型 代表
RSA公钥密码 RSA-OAEP
离散对数公钥密码 ElGamal
椭圆曲线混合加密 ECIES类方案

需要避免直接使用“裸RSA”:

1
RSA(m)

现代应用应使用安全填充或封装方案,例如:

1
RSA-OAEP

2.2 密钥协商

代表:

1
2
3
Diffie–Hellman
ECDH
X25519

这些机制通常不是直接加密消息,而是让通信双方计算出相同共享密钥,再使用AES等对称密码加密大量数据。

代表:

1
2
3
4
RSA-PSS
DSA
ECDSA
EdDSA

数字签名解决的是:

  • 谁签署了数据;
  • 数据是否被篡改;
  • 签名者能否否认。

3. 密码学哈希函数

哈希函数执行:

1
2
任意长度消息
→ 固定长度摘要

3.1 MD系列

1
2
3
MD2
MD4
MD5

其中MD5通常输出128位摘要,即:

1
32个十六进制字符

3.2 SHA-1

1
SHA-1

输出160位摘要,通常显示为40个十六进制字符。


3.3 SHA-2系列

1
2
3
4
5
6
SHA-224
SHA-256
SHA-384
SHA-512
SHA-512/224
SHA-512/256

注意:

1
SHA-512/256

不是简单截取SHA-512前256位,而是使用不同初始化值定义的独立SHA-2变体。


3.4 SHA-3系列

1
2
3
4
SHA3-224
SHA3-256
SHA3-384
SHA3-512

SHA-3基于Keccak结构,与SHA-2内部结构不同。


3.5 RIPEMD系列

文章出现:

1
2
3
4
RIPEMD-128
RIPEMD-160
RIPEMD-256
RIPEMD-320

它们都属于密码学哈希函数,数字表示摘要位数。


3.6 HAVAL系列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
HAVAL-128-3
HAVAL-128-4
HAVAL-128-5

HAVAL-160-3
HAVAL-160-4
HAVAL-160-5

HAVAL-192-3
HAVAL-192-4
HAVAL-192-5

HAVAL-224-3
HAVAL-224-4
HAVAL-224-5

HAVAL-256-3
HAVAL-256-4
HAVAL-256-5

其中:

  • 第一个数字表示摘要位数;
  • 最后的3、4、5表示轮数。

均属于密码学哈希,不是加密。


3.7 Tiger系列

1
2
3
4
5
6
Tiger-128-3
Tiger-128-4
Tiger-160-3
Tiger-160-4
Tiger-192-3
Tiger-192-4

其中128、160、192表示输出位数;3、4通常表示处理轮数。


3.8 其他密码学哈希

1
2
3
4
5
GOST
GOST-Crypto
Snefru
Snefru-256
Whirlpool

4. 消息认证码

HMAC

HMAC的完整名称是:

1
2
Hash-based Message Authentication Code
基于哈希的消息认证码

其输入通常包括:

1
2
3
共享密钥
+
消息

输出是认证标签。

HMAC主要验证:

  1. 消息是否被修改;
  2. 消息是否来自持有共享密钥的一方。

它不能隐藏消息,也不能从HMAC值恢复原文。

常见实例:

1
2
3
4
HMAC-SHA-256
HMAC-SHA-512
HMAC-SHA-1
HMAC-MD5

5. 口令摘要与验证格式

5.1 NTLM

NTLM口令摘要属于Windows口令验证体系。

严格分类:

1
口令摘要/口令验证值

5.2 Domain Cached Credentials

又常见为:

1
2
3
DCC
MSCache
DCC2

用于Windows域环境中的缓存凭据验证。

它属于口令派生验证值,不是可正常解密的密文。


5.3 MySQL旧口令摘要

1
mysql

通常指旧MySQL口令摘要算法。


5.4 MySQL 5口令摘要

1
mysql5

通常指MySQL较新版本曾使用的SHA-1相关口令验证格式。

这几项都应归入:

1
数据库或操作系统专用口令验证格式

不应简单叫做“可解密密码”。


6. 非密码学哈希与校验和

6.1 Adler-32

1
Adler-32

属于校验和,用于检测传输或存储错误。


6.2 CRC系列

1
2
CRC32
CRC32B

属于循环冗余校验。

用途主要是:

1
检测意外错误

6.3 FNV系列

1
2
3
4
FNV-1 32位
FNV-1 64位
FNV-1a 32位
FNV-1a 64位

FNV是快速的非密码学哈希,适合散列表、标识符和普通数据分散,不适合密码、签名或防篡改。


6.4 JOAAT

1
JOAAT

通常指Jenkins One-at-a-Time Hash。

它属于快速非密码学哈希。


Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Wishing you good luck and happiness every day!今天小雨,愿每一次阅读都带给你温暖与收获
使用 Hugo 构建
主题 StackJimmy 设计