本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、加解密
在数据存储或传输场景中,可以使用加解密操作来保证数据的机密性,防止敏感数据泄露。
应用场景
| 场景 |
说明 |
| 对称密钥加解密 |
使用同一个密钥进行加密和解密,适合大量数据加密 |
| 非对称密钥加解密 |
使用公钥加密、私钥解密,适合密钥分发和数字签名 |
| RSA PKCS1_OAEP |
获取、设置CipherSpecItem参数 |
二、对称加密算法
| 算法 |
特点 |
分组长度 |
支持模式 |
API版本 |
| AES |
最常用,安全性高 |
128位 |
ECB/CBC/OFB/CFB/CTR/GCM/CCM |
9+ |
| DES |
老旧,安全性低 |
64位 |
ECB/CBC/OFB/CFB |
20+ |
| 3DES |
DES的改进,仍较慢 |
64位 |
ECB/CBC/OFB/CFB |
9+ |
| SM4 |
国密算法 |
128位 |
ECB/CBC/CTR/OFB/CFB/CFB128/GCM |
10+ |
| ChaCha20 |
流密码,高效 |
无 |
Poly1305 |
22+ |
三、AES对称加密
AES(Advanced Encryption Standard)是最常用的对称加密算法,分组长度为128位(16字节)。
支持的加密模式
| 模式 |
说明 |
| ECB |
电子密码本模式,最简单的模式,不推荐 |
| CBC |
密码块链接模式,需要初始向量IV |
| OFB |
输出反馈模式,流模式,无需填充 |
| CFB |
密码反馈模式,流模式,无需填充 |
| CTR |
计数器模式,流模式,无需填充 |
| GCM |
伽罗瓦/计数器模式,认证加密,推荐 |
| CCM |
计数器与密码块链消息认证码模式,认证加密 |
支持的密钥长度
| 密钥长度 |
说明 |
| 128 bit |
16字节,安全性足够 |
| 192 bit |
24字节 |
| 256 bit |
32字节,最高安全级别 |
支持的填充模式
| 填充模式 |
说明 |
| NoPadding |
不带填充,输入数据需与分组长度匹配 |
| PKCS5 |
8字节填充(AES实际填充16字节) |
| PKCS7 |
1-255字节填充(AES实际填充16字节) |
注意:由于AES分组长度为16字节,PKCS5和PKCS7在AES中都以16字节作为填充长度。
字符串参数格式
格式:[算法][密钥长度]|[分组模式]|[填充模式]
示例:AES128|ECB|PKCS7
AES规格表
| 分组模式 |
密钥长度(bit) |
填充模式 |
API版本 |
| ECB |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CBC |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CTR |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| OFB |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CFB |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| GCM |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CCM |
128/192/256 |
NoPadding/PKCS5/PKCS7 |
9+ |
特殊说明
-
ECB、CBC模式:明文长度不是128位整数倍时,必须使用填充
-
CCM模式:必须指定附加验证数据aad,且长度≥1字节且≤2048字节
-
CFB、OFB、CTR、GCM、CCM:属于流模式,不需要填充
API 10+特性
从API版本10开始,支持对称加解密不带密钥长度的规格,加解密运算取决于实际输入的密钥长度。
示例:AES|CFB|NoPadding
四、DES对称加密
DES(Data Encryption Standard)是较早的对称加密算法,分组长度为64位(8字节),现已不推荐使用。
支持的加密模式
| 模式 |
说明 |
| ECB |
电子密码本模式 |
| CBC |
密码块链接模式 |
| OFB |
输出反馈模式 |
| CFB |
密码反馈模式 |
密钥长度
| 密钥长度 |
说明 |
| 64 bit |
8字节(实际有效56位) |
支持的填充模式
| 填充模式 |
说明 |
| NoPadding |
不带填充,输入数据需与分组长度匹配 |
| PKCS5 |
8字节填充 |
| PKCS7 |
1-255字节填充(实际填充8字节) |
字符串参数格式
示例:DES64|ECB|PKCS7
DES规格表
| 分组模式 |
密钥长度(bit) |
填充模式 |
API版本 |
| ECB |
64 |
NoPadding/PKCS5/PKCS7 |
20+ |
| CBC |
64 |
NoPadding/PKCS5/PKCS7 |
20+ |
| OFB |
64 |
NoPadding/PKCS5/PKCS7 |
20+ |
| CFB |
64 |
NoPadding/PKCS5/PKCS7 |
20+ |
特殊说明
五、3DES对称加密
3DES(Triple DES)是对DES的改进,通过三次DES加密提高安全性,分组长度仍为64位(8字节)。
支持的加密模式
| 模式 |
说明 |
| ECB |
电子密码本模式 |
| CBC |
密码块链接模式 |
| OFB |
输出反馈模式 |
| CFB |
密码反馈模式 |
密钥长度
| 密钥长度 |
说明 |
| 192 bit |
24字节(3×64位) |
支持的填充模式
| 填充模式 |
说明 |
| NoPadding |
不带填充 |
| PKCS5 |
8字节填充 |
| PKCS7 |
1-255字节填充(实际填充8字节) |
字符串参数格式
示例:3DES192|ECB|PKCS7
3DES规格表
| 分组模式 |
密钥长度(bit) |
填充模式 |
API版本 |
| ECB |
192 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CBC |
192 |
NoPadding/PKCS5/PKCS7 |
9+ |
| OFB |
192 |
NoPadding/PKCS5/PKCS7 |
9+ |
| CFB |
192 |
NoPadding/PKCS5/PKCS7 |
9+ |
特殊说明
六、SM4对称加密
SM4是中国国家密码管理局发布的国密算法,分组长度为128位(16字节)。
支持的加密模式
| 模式 |
说明 |
| ECB |
电子密码本模式 |
| CBC |
密码块链接模式 |
| CTR |
计数器模式 |
| OFB |
输出反馈模式 |
| CFB |
密码反馈模式 |
| CFB128 |
128位密码反馈模式 |
| GCM |
伽罗瓦/计数器模式 |
密钥长度
支持的填充模式
| 填充模式 |
说明 |
| NoPadding |
不带填充 |
| PKCS5 |
16字节填充 |
| PKCS7 |
1-255字节填充(实际填充16字节) |
字符串参数格式
格式:[算法]_[密钥长度]|[分组模式]|[填充模式]
示例:SM4_128|ECB|PKCS7
SM4规格表
| 分组模式 |
密钥长度(bit) |
填充模式 |
API版本 |
| ECB |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| CBC |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| CTR |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| OFB |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| CFB |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| CFB128 |
128 |
NoPadding/PKCS5/PKCS7 |
10+ |
| GCM |
128 |
NoPadding/PKCS5/PKCS7 |
12+ |
特殊说明
七、AES-WRAP
AES-WRAP是一种基于AES的加密算法,用于安全地存储或传输对称密钥,防止密钥在存储或传输过程中被泄露或篡改。
规格表
| 算法名称 |
字符串参数 |
API版本 |
| AES128_WRAP |
AES128_WRAP |
22+ |
| AES256_WRAP |
AES256_WRAP |
22+ |
| AES384_WRAP |
AES384_WRAP |
22+ |
八、ChaCha20
ChaCha20是一种流密码算法,无需填充,性能高效,从API 22开始支持。
支持的加密模式
| 模式 |
说明 |
| Poly1305 |
认证加密模式,提供消息完整性校验 |
密钥长度
字符串参数格式
ChaCha20 # 基础模式
ChaCha20|Poly1305 # Poly1305认证模式
规格表
| 对称算法名 |
密钥长度(bit) |
字符串参数 |
API版本 |
| ChaCha20 |
256 |
ChaCha20 |
22+ |
| ChaCha20 |
256 |
ChaCha20|Poly1305 |
22+ |
九、填充模式
分组加密算法有固定的分组长度,当最后一组明文数据量不足固定长度时,需要通过填充补齐。
各填充模式说明
| 模式 |
说明 |
| NoPadding |
不带填充,输入数据必须与分组长度匹配 |
| PKCS5 |
固定8字节填充,适用于DES/3DES |
| PKCS7 |
1-255字节可变填充,AES/3DES/SM4实际按分组长度填充 |
不同算法的填充规则
| 算法 |
分组长度 |
PKCS5/PKCS7填充长度 |
| AES |
16字节 |
16字节 |
| DES |
8字节 |
8字节 |
| 3DES |
8字节 |
8字节 |
| SM4 |
16字节 |
16字节 |
流模式说明
对于CFB、OFB、CTR、GCM、CCM这类将分组密码转化为流模式实现的模式,不需要填充,无论是否指定填充模式,都会按照NoPadding实现。
十、常用配置示例
| 场景 |
字符串参数 |
| AES-128 ECB模式 PKCS7填充 |
AES128|ECB|PKCS7 |
| AES-256 CBC模式 NoPadding |
AES256|CBC|NoPadding |
| AES-128 GCM模式 |
AES128|GCM|NoPadding |
| 3DES-192 CBC模式 PKCS5填充 |
3DES192|CBC|PKCS5 |
| SM4-128 CBC模式 PKCS7填充 |
SM4_128|CBC|PKCS7 |
| ChaCha20基础模式 |
ChaCha20 |
| ChaCha20 Poly1305认证模式 |
ChaCha20|Poly1305 |
不带密钥长度(API 10+)
| 场景 |
字符串参数 |
| AES任意长度 |
AES|CFB|NoPadding |
| DES任意长度 |
DES|CFB|NoPadding |
| 3DES任意长度 |
3DES|CFB|NoPadding |
总结
| 场景 |
推荐算法 |
原因 |
| 通用加密 |
AES-256-GCM |
安全性高,支持认证加密 |
| 国密合规 |
SM4-GCM |
国密标准 |
| 密钥封装 |
AES-WRAP |
专门用于密钥保护 |
| 高性能流加密 |
ChaCha20 |
软件实现效率高 |
| 遗留系统兼容 |
3DES |
老系统迁移 |
| 要点 |
说明 |
| 分组长度 |
AES/SM4 128位,DES/3DES 64位 |
| 流模式无需填充 |
CFB/OFB/CTR/GCM/CCM 模式不需要填充 |
| CBC/ECB需要填充 |
必须使用PKCS5/PKCS7填充 |
| 字符串格式 |
算法|模式|填充,SM4用下划线连接算法和长度 |
鸿蒙对称加密支持AES、DES、3DES、SM4、ChaCha20五种算法,通过算法|模式|填充字符串参数配置,其中AES和SM4推荐使用GCM模式实现认证加密。
所有评论(0)