请求统一加密传输
请求参数
参数 | 二级参数 | 类型 | 必填 | 说明 |
---|---|---|---|---|
version | - | string | 是 | 版本 v2 |
encrypt | - | string | 是 | 加密方式 aes,rsa(版本2以上提供,默认aes,老接口rsa)aes cbc模式 |
appKey | - | string | 是 | appKey 渠道商号 找我方获取 |
reqId | - | string | 是 | 请求id,每次生成,如果失败重复请求,保持不变 |
params | - | string | 是 | 根据加密方式密文 转base64 |
返回数据
参数 | 二级参数 | 类型 | 必填 | 说明 |
---|---|---|---|---|
reqId | - | string | 是 | 请求id,每次生成,如果失败重复请求,保持不变 |
code | - | int | 是 | 状态码,详见状态码 |
msg | - | string | 是 | 消息内容 |
data | - | string | 是 | 密文转base64 |
加密方式
接口通过aes 加密 cbc 模式 请求时序图如下
备注:
- 请求加密串最终存在params,返回数据加密串存在data参数
- 如果返回数据只有状态码,没有data数据,就不需要做加密返回。
数据加密
- 消息内容为: TestMessage (前后无空格)
- 密钥为: qwertyuiop123456 (前后无空格)
- 通过aes_cbc模式,并Base64后: 5cfJMwX0w65sEQVBxu9zHw==
- 初始向量参数为密钥前16位
请求json示例
{
"version":"2.0",
"reqId":"xxxxxx",
"encrypt":"aes",
"appKey":"testappid",
"params":"5cfJMwX0w65sEQVBxu9zHw=="
}
返回json示例
{
"reqId":"xxxxxx",
"code":200,
"msg":"ok",
"data":"5cfJMwX0w65sEQVBxu9zHw=="
}
go aes cbc加解密函数
package cryptos
import (
"bytes"
"crypto/aes"
"crypto/cipher"
)
// =================== CBC ======================
// key的长度必须为16, 24或者32
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte, err error) {
// 分组秘钥
block, _err := aes.NewCipher(key)
if _err != nil {
err = _err
return
}
blockSize := block.BlockSize() // 获取秘钥块的长度
origData = pkcs5Padding(origData, blockSize) // 补全码
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) // 加密模式
encrypted = make([]byte, len(origData)) // 创建数组
blockMode.CryptBlocks(encrypted, origData) // 加密
return encrypted, nil
}
// key的长度必须为16, 24或者32
func AesDecryptCBC(encrypted []byte, key []byte) (decrypted []byte, err error) {
block, _err := aes.NewCipher(key) // 分组秘钥
if _err != nil {
err = _err
return
}
blockSize := block.BlockSize() // 获取秘钥块的长度
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) // 加密模式
decrypted = make([]byte, len(encrypted)) // 创建数组
blockMode.CryptBlocks(decrypted, encrypted) // 解密
decrypted = pkcs5UnPadding(decrypted) // 去除补全码
return decrypted, nil
}
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func pkcs5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
java aes cbc加解密函数
package com.ipipv.open.utils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESCBC {
public static byte[] encryptCBC(byte[] data, byte[] key, byte[] iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
byte[] result = cipher.doFinal(data);
return result;
}
public static byte[] decryptCBC(byte[] data, byte[] key, byte[] iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
byte[] result = cipher.doFinal(data);
return result;
}
public static void main(String[] args) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException {
String data = "TestMessage"; // 待加密的原文
String key = "qwertyuiop123456asdfghjk"; // key 长度只能是 16、24 或 32 字节
String iv = key.substring(0,16); // CBC 模式需要用到初始向量参数
byte[] ciphertext = encryptCBC(data.getBytes(), key.getBytes(), iv.getBytes());
System.out.println("CBC 模式加密结果(Base64):" + Base64.getEncoder().encodeToString(ciphertext));
byte[] plaintext = decryptCBC(ciphertext, key.getBytes(), iv.getBytes());
System.out.println("解密结果:" + new String(plaintext));
}
}