AES 加密
部分敏感字段(如支付密码、退款密码)需使用 AES 加密后传输,确保数据安全。
加密算法
| 参数 | 值 |
|---|---|
| 算法标识 | AES_256_CBC |
| 加密模式 | CBC |
| 填充方式 | PKCS#7(Java 下为 PKCS5Padding,两者等价) |
| 密钥长度 | 256 位 |
| IV 长度 | 128 位(16 字节) |
密钥获取
AES 密钥在终端激活时由平台分配,通过激活接口响应中的 ase_key 字段返回(Base64 编码)。
加密数据结构
需要加密传输的字段使用以下 JSON 结构:
{
"algorithm": "AES_256_CBC",
"ciphertext": "Base64编码的密文",
"iv": "Base64编码的初始化向量"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| algorithm | String | 是 | 加密算法,固定为 AES_256_CBC |
| ciphertext | String | 是 | Base64 编码后的密文 |
| iv | String | 是 | 加密使用的初始化向量(IV),Base64 编码 |
加密流程
- 生成 16 字节随机 IV
- 使用 AES-256-CBC 模式和 PKCS#7 填充方式加密明文
- 将密文和 IV 分别进行 Base64 编码
- 组装加密数据结构
PKCS#7 填充说明
PKCS#7(RFC 5652)是一种块加密填充算法,规则如下:
- 设块大小为
BS(AES 中 BS = 16 字节),明文长度为L - 需填充的字节数
P = BS - (L % BS),取值范围为 1 ~ BS - 每个填充字节的值均为
P
示例(AES 块大小 16 字节):
| 明文长度(字节) | 填充字节数 | 填充内容 |
|---|---|---|
| 15 | 1 | 0x01 |
| 14 | 2 | 0x02 0x02 |
| 1 | 15 | 0x0F 0x0F ... 0x0F |
| 16(整块) | 16 | 0x10 0x10 ... 0x10 |
信息
- 当明文长度恰好为块大小的整数倍时,仍需填充一个完整块(16 字节),值为
0x10 - Java 中
PKCS5Padding实际上是 PKCS#7 的子集(PKCS#5 仅定义了 8 字节块),在 AES 场景下两者完全等价 - Python
pycryptodome使用Crypto.Util.Padding.pad/unpad - JavaScript
crypto-js使用CryptoJS.pad.Pkcs7
加解密示例
请求示例
{
"amount": 100,
"out_trade_no": "TS20260507000001",
"auth_code": "134567890123456789",
"password": {
"algorithm": "AES_256_CBC",
"ciphertext": "Base64编码的密文",
"iv": "Base64编码的IV"
}
}