AES-256和PKCS7Padding在Java中失败
我有几个库,C#,PHP和Android,它们都以相同的方式加密/解密字符串,因此它们彼此兼容,即C#写入并加密数据到数据库,PHP可以成功解密它并返回原始字符串。
我现在需要使用标准的Java应用程序做同样的事情,所以我从我的Android库中获取代码并需要库,但我得到了一个例外。 据我所知,代码不是特定于Android的,所以它应该不是问题。
以下是我的加密function
public static String encrypt(String plainPasword) { String password = ""; try { SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES"); IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII")); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); byte[] encoded = cipher.doFinal(plainPasword.getBytes()); password = new String(Base64.encodeBase64(encoded)); } catch (Exception ex) { System.err.println("Encryption Exception: " + ex.toString()); } return password; }
当我调用Encryption.encrypt("myString");
我得到以下exception:
Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
正如我所说,这段代码在Android上工作得很好,它在运行的地方不应该有任何区别。
感谢您的任何帮助,您可以提供。
UPDATE
我发现由于评论链接,我需要PKCS5Padding而不是7。 我现在虽然得到以下exception:
Encryption Exception: java.security.InvalidKeyException: Illegal key size
首先,在Java中,标准填充名称是PKCS5Padding,而不是PKCS7Padding。 Java实际上正在执行PKCS#7填充,但在JCA规范中,PKCS5Padding是给定的名称。
接下来,您尝试使用AES-256,因此您需要安装Unlimited Strength Jurisdiction策略文件。
希望这只是一个例子,你没有为每条消息使用相同的IV,对吧?
- 图像文件的加密和解密
- Java AES:没有安装的提供程序支持此密钥:javax.crypto.spec.SecretKeySpec
- ‘str = new String(bytes,“UTF8”)’和’bytes = str.getBytes(“UTF8”)’中的字节值不一样
- Java AES CBC解密
- PBEWITHSHA256AND128BITAES-CBC-BC在RedHat 6.4上创建java.security.NoSuchAlgorithmException
- 没有解密我加密的内容
- 使用Java进行AES加密并使用Javascript进行解密
- Java和PHP之间的加密不匹配
- 为什么桌面AES文件IO与Android AES文件IO不兼容?