跳到主要内容

AES对称加秘解密

简介

AES全称Advanced Encryption Standard,高级加密标准。

AES是目前对称加密中比较通用的一种加码方式,也是企连云进行数据传输的过程中,对数据进行加密的方案。

企连云调用提供方接口或使用方调用企连云接口时,请求参数biz_content和响应参数data默认情况下均为明文。开启加密后,请求体和返回体中的业务字段在网络上传输会由明文转变为秘文,大大提升了业务数据传输的安全性。

目前企连云只有部分敏感业务数据要求使用AES加密解密,请参考相关接口文档或咨询企连云业务方。

调用方调用企连云

调用方在进行对接时,如果和企连云业务方确认需要进行AES加密传输,则需要完成一下步骤:

1.对请求业务参数biz_content字符串进行AES加密运算

2.请求企连云接口时,携带额外表单参数need_encrypt=true

3.接收企连云响应后,对响应的结构体data,进行AES解密

注:RSA签名不受AES加密影响,调用方需要先将biz_content内容进行加密,加密后的秘文再参与签名sign的生成。

企连云调用提供方

企连云调用提供方时,根据提供方的实际情况,参考是否要进行AES加密传输,如果不需要则告知企连云,如果需要,则要完成一下步骤:

1.接口提供方接收到企连云请求后,将业务参数biz_content字符串进行AES解密,得到业务参数明文。

2.接口提供方在进行响应数据封装时,对应响应体中的data内容需要进行AES加密。

注:RSA验签不受AES加密解密影响,提供方在接受到企连云的请求时,对biz_content秘文进行验签,验签通过后对biz_content参数进行AES解密。

代码示例

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
* @Classname AESUtils
* @Description AES 工具方法
* @Date 2024/8/24 07:43
* @Created by noway
*/
public class AESUtils {

private static final String AES_ALG="AES";

private static final String AES_CBC_PCK_ALG="AES/CBC/PKCS5Padding";

private static final byte[] AES_IV=initIv(AES_CBC_PCK_ALG);


/**
* 初始化向量方法,全部为0
* @param aesCbcPckAlg
* @return
*/
private static byte[] initIv(String aesCbcPckAlg) {

try {
Cipher cipher= Cipher.getInstance(aesCbcPckAlg);
int blockSize=cipher.getBlockSize();
byte[] iv = new byte[blockSize];
for(int i=0;i<blockSize;++i){
iv[i] = 0;
}
return iv;
}catch (Exception e){
int blockSize = 16;
byte[] iv = new byte[blockSize];
for (int i = 0; i < blockSize; ++i) {
iv[i] = 0;
}
return iv;
}


}

/**
* AES 加密
* @param content
* @param aesKey
* @param charset
* @return
* @throws Exception
*/
public static String aesEncrypt(String content,String aesKey,String charset) throws Exception {
try {
Cipher cipher= Cipher.getInstance(AES_CBC_PCK_ALG);
IvParameterSpec iv = new IvParameterSpec(AES_IV);
cipher.init(Cipher.ENCRYPT_MODE,new SecretKeySpec(Base64.decodeBase64(aesKey.getBytes()), AES_ALG),iv);
byte[] encryptBytes = cipher.doFinal(content.getBytes(charset));
return new String(Base64.encodeBase64(encryptBytes));
}catch (Exception e){
throw new Exception(e);
}

}

/**
* AES 解密
* @param content
* @param aeskey
* @param charset
* @return
* @throws Exception
*/
public static String aesDecrypt(String content,String aeskey,String charset) throws Exception {
try {
Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
IvParameterSpec iv = new IvParameterSpec(initIv(AES_CBC_PCK_ALG));
cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(Base64.decodeBase64(aeskey.getBytes()),AES_ALG),iv);
byte[] cleanBytes = cipher.doFinal(Base64.decodeBase64(content.getBytes()));
return new String(cleanBytes,charset);
}catch (Exception e){
throw new Exception(e);
}

}

public static void main(String[] args) throws Exception {
String aesKey = "7ECF0A2CAC368600C76FFAF7DDCB253F";
String charset ="UTF-8";

//String content="weKsNqlOJGfg9c2ehh9PEAwa5us07q7kIsJ51ZD+4Y3H8MmBPuSIIy6zIIDUfwzw8f+gNncJRr9gnarFZvB2MmAT5InhUVRze0SaU7RWc6byrnR3zkPlr0jEboVZFXCB";
String content="q2/OPPB4E+V66UxIm7p9FpP91RMDh4JN3U7q1xy9/tM=";
System.out.println(aesDecrypt(content,aesKey,charset));

String data = "{\"shop_id\":\"1067\",\"status\":\"1\"}";
System.out.println(aesEncrypt(data,aesKey,charset));
}

}

注:AES秘钥的获取请联系企连云业务方

加密算法明细

加密算法标准加密算法初始向量描述
AESAES/CBC/PKCS5Padding128位(16字节)全0值AES密钥长度为128位
  1. 对称密钥aesKey采用BASE64格式编码,所以在进行加解密时需要先将对称密钥进行BASE64解码后使用
  2. AES算法采用CBC模式进行加解密,初始向量定义为128位(16字节)全0值
  3. 加密后得到字节数组需要先做 base64 编码,然后再新建字符串(由于 base64 后的字节一定是 ASCII 范围内,所以最后一步 new String 的时候无需指定字符集),同理解密前的内容需要先做 base64 解码,用于传输的密文内容永远是经过base64编码过的