加密过程容易出现本地正常,服务器加解密失败的情况,需要用
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed("规定密钥xxx".getBytes());
kg.init(128,secureRandom);
进行转换,(服务器的转化是随机的)
加密方法
//加密方法 public String encode(String content){ String encrypted = ""; logger.info("加密前: " + content); try { //根据指定字符串生成秘钥 KeyGenerator kg = KeyGenerator.getInstance("AES"); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed("规定密钥xxx".getBytes()); kg.init(128,secureRandom); SecretKey sk = kg.generateKey(); String keyStr = Base64.getEncoder().encodeToString(sk.getEncoded()); byte[] iv = Base64.getDecoder().decode(keyStr); byte[] key = Base64.getDecoder().decode(keyStr); encrypted = Base64.getEncoder().encodeToString(encrypt(iv, key, content.getBytes("utf-8"))); encrypted = URLEncoder.encode(encrypted, "utf-8"); logger.info("加密后: " + encrypted); } catch (Exception e) { e.printStackTrace(); } return encrypted; }public byte[] encrypt(byte[] iv, byte[] key, byte[] raw) { try { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式" IvParameterSpec ips = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips); return cipher.doFinal(raw); } catch (Exception e) { throw new RuntimeException(e); } }
解密方法
//解密方法 public String decode(String encrypted){ String raw = ""; logger.info("解密前: " + encrypted); try { encrypted = URLDecoder.decode(encrypted, "utf-8"); //根据指定字符串生成秘钥 KeyGenerator kg = KeyGenerator.getInstance("AES"); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed("规定密钥xxx".getBytes()); kg.init(128,secureRandom); SecretKey sk = kg.generateKey(); String keyStr = Base64.getEncoder().encodeToString(sk.getEncoded()); byte[] iv = Base64.getDecoder().decode(keyStr); byte[] key = Base64.getDecoder().decode(keyStr); raw = new String(decrypt(iv, key, Base64.getDecoder().decode(encrypted))); logger.info("解密后: " + raw); } catch (Exception e) { e.printStackTrace(); } return raw; }public byte[] decrypt(byte[] iv, byte[] key, byte[] encryptContent) { try { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips); return cipher.doFinal(encryptContent); } catch (Exception e) { throw new RuntimeException(e); } }