12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package utils;
- import com.alibaba.fastjson.JSONObject;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- import javax.crypto.Cipher;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
- import java.nio.charset.StandardCharsets;
- import java.security.AlgorithmParameters;
- import java.security.Security;
- import java.util.Arrays;
- /**
- * 解密工具
- */
- public class AppletDecryptDataUtil {
- public static JSONObject decryptData(byte[] keyByte, byte[] ivByte, byte[] dataByte) throws Exception {
- // 如果密钥不足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;
- }
- byte[] resultByte;
- // 初始化
- Security.addProvider(new BouncyCastleProvider());
- try {
- Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
- SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
- AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
- parameters.init(new IvParameterSpec(ivByte));
- cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
- resultByte = cipher.doFinal(dataByte);
- if (null == resultByte || resultByte.length <= 0) {
- return null;
- }
- }catch (Exception e){
- 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);// 初始化
- resultByte = cipher.doFinal(dataByte);
- if (null == resultByte || resultByte.length <= 0) {
- return null;
- }
- }
- String result = new String(resultByte, StandardCharsets.UTF_8);
- return JSONObject.parseObject(result);
- }
- }
|