java jurisdiction调用_java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办...

这篇博客介绍了在Java中使用AES-256加密时遇到的PKCS7Padding不支持问题,以及如何通过引入BouncyCastle组件来解决该问题。提供了详细的代码示例,包括加密和解密方法,同时提到了Android平台上的兼容性。此外,还提及了Java JCE无限强度政策文件的下载和替换步骤。
摘要由CSDN通过智能技术生成

在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里面支持PKCS7Padding填充。

説辣么多不如上代码:

public class AESUtil {

/**

* Encodes a String in AES-256 with a given key

*

* @param context

* @param password

* @param text

* @return String Base64 and AES encoded String

*/

public static String encode(String keyString, String stringToEncode) throws NullPointerException {

if (keyString.length() == 0 || keyString == null) {

throw new NullPointerException("Please give Password");

}

if (stringToEncode.length() == 0 || stringToEncode == null) {

throw new NullPointerException("Please give text");

}

try {

SecretKeySpec skeySpec = getKey(keyString);

byte[] clearText = stringToEncode.getBytes("UTF8");

// IMPORTANT TO GET SAME RESULTS ON iOS and ANDROID

final byte[] iv = new byte[16];

Arrays.fill(iv, (byte) 0x00);

IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

/**

* 这个地方调用BouncyCastleProvider

*让java支持PKCS7Padding

*/

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

// Cipher is not thread safe

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);

String encrypedValue = Base64.encodeToString(cipher.doFinal(clearText), Base64.DEFAULT);

// Log.d("jacek", "Encrypted: " + stringToEncode + " -> " + encrypedValue);

return encrypedValue;

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (InvalidAlgorithmParameterException e) {

e.printStackTrace();

}

return "";

}

/**

* Decodes a String using AES-256 and Base64

*

* @param context

* @param password

* @param text

* @return desoded String

*/

public static String decode(String password, String text) throws NullPointerException {

if (password.length() == 0 || password == null) {

throw new NullPointerException("Please give Password");

}

if (text.length() == 0 || text == null) {

throw new NullPointerException("Please give text");

}

try {

SecretKey key = getKey(password);

// IMPORTANT TO GET SAME RESULTS ON iOS and ANDROID

final byte[] iv = new byte[16];

Arrays.fill(iv, (byte) 0x00);

IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

byte[] encrypedPwdBytes = Base64.decode(text, Base64.DEFAULT);

// cipher is not thread safe

/**

* 这个地方调用BouncyCastleProvider

*让java支持PKCS7Padding

*/

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);

byte[] decrypedValueBytes = (cipher.doFinal(encrypedPwdBytes));

String decrypedValue = new String(decrypedValueBytes);

//Log.d(LOG_TAG, "Decrypted: " + text + " -> " + decrypedValue);

return decrypedValue;

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (InvalidAlgorithmParameterException e) {

e.printStackTrace();

}

return "";

}

/**

* Generates a SecretKeySpec for given password

*

* @param password

* @return SecretKeySpec

* @throws UnsupportedEncodingException

*/

private static SecretKeySpec getKey(String password) throws UnsupportedEncodingException {

// You can change it to 128 if you wish

int keyLength = 256;

byte[] keyBytes = new byte[keyLength / 8];

// explicitly fill with zeros

Arrays.fill(keyBytes, (byte) 0x0);

// if password is shorter then key length, it will be zero-padded

// to key length

byte[] passwordBytes = password.getBytes("UTF-8");

int length = passwordBytes.length < keyBytes.length ? passwordBytes.length : keyBytes.length;

System.arraycopy(passwordBytes, 0, keyBytes, 0, length);

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

return key;

}

public static void main(String args[])

{

long startTime = System.currentTimeMillis();

String encodeStr = AESUtil.encode("1234", "你要去哪儿test123");

System.out.println("encoder:"+encodeStr);

String decodeStr = AESUtil.decode("1234",encodeStr);

System.out.println("decoder:"+decodeStr);

}

}

默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 你需要下载一个支持更长密钥的包。这个包叫做

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8

,可以从这里下载,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。下好了zip文件以后,把里面的两个jar包(local_policy.jar,US_export_policy.jar)替换掉jdk的security文件夹中相应的jar包就OK啦。

但是我确实遇到一个比较奇怪的问题,我在android上面调用PKCS7Padding 是没有问题的,但是在java写的服务端就有问题了。不知道为什么,我用的jdk都是1.8.0的jdk。还请各位如果有遇到相同情况的可以解答一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遇到 "error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC" 错误,通常是因为 Java 加密库 (Java Cryptography Extension, JCE) 中的某个安全提供者 (Provider) 没有正确配置或授权。BC (Bouncy Castle) 提供者在这种情况下出现问题。 解决步骤如下: 1. **检查JDK安装**:确保你的Java Development Kit (JDK) 安装包含了正确的加密库,特别是Bouncy Castle。有时它可能不是默认安装的一部分,需要单独下载并添加到JDK的jre/lib/security目录下。 2. **更新或添加BC JCE**:从Bouncy Castle官网下载最新版本的JCE Unlimited Strength Jurisdiction Policy Files,它们包含了解决此问题所需的权限文件。将下载的jar包放入`JAVA_HOME/jre/lib/security` 或 `JRE_HOME/lib/security` 目录下。 3. **重启JVM**:更改了库之后,你需要重启Java虚拟机(JVM),让系统加载新的安全提供者。 4. **检查安全策略**:打开`JAVA_HOME/jre/lib/security/java.security` 文件,查看是否正确添加了Bouncy Castle的provider信息。如果没有,需要添加类似这样的行: ``` security.provider.1=BC security.provider.10=bouncyCastleProvider ``` 5. **重新部署应用**:最后,重新部署你的应用程序,确保Java运行环境能够识别并使用新添加的BC Provider。 如果以上步骤都无法解决问题,可能是其他第三方库或者代码中存在冲突,尝试更新依赖库或排查相关的代码段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值