AES加解密接口对接文档

概述

本文档描述了如何使用AESUtils类进行数据的加密和解密操作,用于安全数据传输。采用AES-128算法,CBC模式,PKCS5Padding填充方式。

下面的key和iv只是示例测试使用,对接接口需要联系客服获取

  1. 加密Key: 请联系客服获取 (示例key3GfGzOytbL1sd6ntjFI8fw==)
  2. 加密Iv:请联系客服获取(示例ivtestiv1234567890)
  3. IV长度:16

全部接口需要加密传输

字段名 变量名 必填 类型 示例值 描述
商户号 mchNo String M1621873433953 商户号,例如:M1621873433953
请求数据 encryptOpenApiData String dGVzdGl2MTIzNDU2Nzg5MFU8gk16WQdmo5ijrUXCLcK4Jrn/g8s3b1JnQPDyszHXjpakD4oJKNs/x8UZoCXMMnIw2o0gNF1l1XVmK6wgsPM= 加密后的数据
请求示例数据
  1. {
  2. "mchNo": "M1621873433953",
  3. "encryptOpenApiData": "dGVzdGl2MTIzNDU2Nzg5MFU8gk16WQdmo5ijrUXCLcK4Jrn/g8s3b1JnQPDyszHXjpakD4oJKNs/x8UZoCXMMnIw2o0gNF1l1XVmK6wgsPM="
  4. }
字段名 变量名 必填 类型 示例值 描述
返回状态 code int 0 0-处理成功,其他-处理有误,详见错误码
返回信息 msg String(128) SUCCESS 具体内容原因,例如:SUCCESS、参数格式校验错误
签名信息 sign String(32) CCD9083A6DAD9A2DA9F668C3D4517A84 对data内数据签名,如data为空则不返回
返回数据 encryptData String {dGVzdGl2MTIzNDU2Nzg5MFU8gk16WQdmo5ijrUXCLcK4Jrn/g8s3b1JnQPDyszHXjpakD4oJKNs/x8UZoCXMMnIw2o0gNF1l1XVmK6wgsPM=} 返回下单数据,需要解密后获得数据

返回示例数据

  1. {
  2. "code": "0",
  3. "encryptData": "dGVzdGl2MTIzNDU2Nzg5MFU8gk16WQdmo5ijrUXCLcK4Jrn/g8s3b1JnQPDyszHXjpakD4oJKNs/x8UZoCXMMnIw2o0gNF1l1XVmK6wgsPM=",
  4. "msg": "SUCCESS",
  5. "sign": "46D52535A52A30D5523C3C29E526F8EC",
  6. }

Java加密示例

  1. /**
  2. * AES加密
  3. * @param plainText 明文
  4. * @param base64Key Base64编码的密钥
  5. * @return Base64编码的加密数据(包含IV)
  6. */
  7. public static String encrypt(String plainText, String base64Key) throws Exception {
  8. // 密钥转换
  9. byte[] keyBytes = Base64.getDecoder().decode(base64Key);
  10. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
  11. // 使用IV
  12. IvParameterSpec ivSpec = new IvParameterSpec(FIXED_IV);
  13. // 加密处理
  14. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  15. cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
  16. byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
  17. // 合并IV和密文
  18. byte[] combined = new byte[FIXED_IV.length + encrypted.length];
  19. System.arraycopy(FIXED_IV, 0, combined, 0, FIXED_IV.length);
  20. System.arraycopy(encrypted, 0, combined, FIXED_IV.length, encrypted.length);
  21. return Base64.getEncoder().encodeToString(combined);
  22. }

Java解密示例

  1. /**
  2. * AES解密
  3. * @param encryptedText Base64编码的加密数据(含IV)
  4. * @param base64Key Base64编码的密钥
  5. * @return 解密后的明文
  6. */
  7. public static String decrypt(String encryptedText, String base64Key) throws Exception {
  8. // 密钥转换
  9. byte[] keyBytes = Base64.getDecoder().decode(base64Key);
  10. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
  11. // 分离IV和密文
  12. byte[] combined = Base64.getDecoder().decode(encryptedText);
  13. byte[] ivBytes = Arrays.copyOfRange(combined, 0, 16);
  14. byte[] encryptedBytes = new byte[combined.length - IV_LENGTH];
  15. System.arraycopy(combined, 0, ivBytes, 0, IV_LENGTH);
  16. System.arraycopy(combined, IV_LENGTH, encryptedBytes, 0, encryptedBytes.length);
  17. IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
  18. // 解密处理
  19. Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
  20. cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
  21. byte[] decrypted = cipher.doFinal(encryptedBytes);
  22. return new String(decrypted, StandardCharsets.UTF_8);
  23. }

使用示例

  1. public static void main(String[] args) throws Exception {
  2. String originalText = "{\"date\":\"2025-04-03 11:05:32\",\"content\":\"腾聚欢迎你\"}";
  3. // 加密
  4. String encrypted = encrypt(originalText, AESUtils.key);
  5. System.out.println("Encrypted: " + encrypted);
  6. // 解密
  7. String decrypted = decrypt(encrypted, AESUtils.key);
  8. System.out.println("Decrypted: " + decrypted);
  9. }