跳到主要内容

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编码的初始化向量"
}
字段类型必填说明
algorithmString加密算法,固定为 AES_256_CBC
ciphertextStringBase64 编码后的密文
ivString加密使用的初始化向量(IV),Base64 编码

加密流程

  1. 生成 16 字节随机 IV
  2. 使用 AES-256-CBC 模式和 PKCS#7 填充方式加密明文
  3. 将密文和 IV 分别进行 Base64 编码
  4. 组装加密数据结构

PKCS#7 填充说明

PKCS#7(RFC 5652)是一种块加密填充算法,规则如下:

  • 设块大小为 BS(AES 中 BS = 16 字节),明文长度为 L
  • 需填充的字节数 P = BS - (L % BS),取值范围为 1 ~ BS
  • 每个填充字节的值均为 P

示例(AES 块大小 16 字节):

明文长度(字节)填充字节数填充内容
1510x01
1420x02 0x02
1150x0F 0x0F ... 0x0F
16(整块)160x10 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"
}
}