请求统一加密传输

请求参数

参数二级参数类型必填说明
version-string版本 v2
encrypt-string加密方式 aes,rsa(版本2以上提供,默认aes,老接口rsa)aes cbc模式
appKey-stringappKey 渠道商号 找我方获取
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));
    }
}