JAVA加密解密异常之java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7
网上最接近的解决办法:
然并卵。
最后解决办法:
1.在jdk中的jre\lib\security修改java.security文件,替换security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider。
并将原有的#security.provider.7=com.sun.security.sasl.Provider 注释掉
2./jdk/jre/lib/ext下添加jar包bcprov-jdk15on-1.58.jar
下载地址:https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.64
问题解决。
另附上加密解密代码:
private static final String ALGORITHM_DES = "DES/ECB/PKCS7Padding";
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @param iv 偏移量
* @return 加密后的字节数组,一般结合Base64编码使用
*/
private static byte[] encrypt(String data, String key, String iv) {
if(data == null)
return null;
try{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
AlgorithmParameterSpec paramSpec = null;
if (iv != null) {
paramSpec = new IvParameterSpec(iv.getBytes());
}
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
return cipher.doFinal(data.getBytes());
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* DES算法,解密
*
* @param data 待解密字符串
* @param key 解密私钥,长度不能够小于8位
* @param iv 偏移量
* @return 解密后的字节数组
*/
private static String decrypt(byte[] data, String key, String iv) {
if(data == null || iv == null)
return null;
try {
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
AlgorithmParameterSpec paramSpec = null;
if (iv != null) {
paramSpec = new IvParameterSpec(iv.getBytes());
}
cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
return new String(cipher.doFinal(data));
} catch (Exception e){
e.printStackTrace();
return "";
}
}