<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>
package com.qmtt.service; import java.security.AlgorithmParameters; import java.security.Security; import java.util.Arrays; import java.util.Base64; import java.util.Map; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.qmtt.tools.JsonUtils; @Service public class WxService { private static final Logger log = LoggerFactory.getLogger(WxService.class); @Autowired RedisTemplate redisTemplate; @Autowired QuestionService questionService; public String getGroupid(String openid, String encryptedData, String iv) { String key = redisTemplate.opsForValue().get("sessionKey_" + openid).toString(); log.info("密钥:<{}>", key); Base64.Decoder decoder = Base64.getDecoder(); byte[] dataByte = decoder.decode(encryptedData); byte[] keyByte = decoder.decode(key); byte[] ivByte = decoder.decode(iv); try { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, "UTF-8"); log.info(result); Map map = JsonUtils.json2map(result); String gid = map.get("openGId").toString(); questionService.addGroup(openid, gid); return gid; } } catch (Exception e) { log.error("", e); } return null; } }