我试图在SpringWeb应用程序中的两个用户之间共享一个使用非对称加密加密的对称密钥。但是我得到了javax的错误。加密。BadPaddingException。
下面是问题的细节。在一种控制器方法中,我使用AES对称密钥进行文件加密,然后用另一个用户公钥加密AES密钥并将其保存到MySQL数据库中。
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
Cipher AESCipher= Cipher.getInstance("AES");
AESCipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherData = AESCipher.doFinal(file.getBytes());
//storing cipherData in database
Cipher RSACipher= Cipher.getInstance("RSA");
RSACipher.init(Cipher.ENCRYPT_MODE, testPubKey);
byte[] aesKeyEncryptedBytes = RSACipher.doFinal(secretKey.getEncoded());
//storing aesKeyEncryptedBytes in Database
在控制器的另一种方法中,我从数据库获取加密的secretkey,使用私钥解密secretkey。构建新的秘密AES密钥以解密加密文件。
Cipher RSACipher= Cipher.getInstance("RSA");
RSACipher.init(Cipher.DECRYPT_MODE, testPvtKey);
//file.getSymmetricKey method give us the encrypted AES symmetric key from database
byte[] decsymetricKeyBytes=RSACipher.doFinal(file.getSymetricKey());
SecretKey symetricKey = new SecretKeySpec(decsymetricKeyBytes,
"AES");
Cipher AESCipher= Cipher.getInstance("AES");
AESCipher.init(Cipher.DECRYPT_MODE, symetricKey);
byte[] plainText = AESCipher.doFinal(file.getResourceFile());
但是当我在这行代码中使用私人密钥解密加密的对称密钥时,它会出错。
byte[] decsymetricKeyBytes=RSACipher.doFinal(file.getSymetricKey());
它正在给出这个错误
May 19, 2015 12:30:27 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [mvc-dispatcher] in context with path [/SP_SC_Hibernate] threw exception [Request processing failed; nested exception is javax.crypto.BadPaddingException: Decryption error] with root cause
javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2121)
at com.dynamic.spring.ResourceController.downloadAsymmetricFile(ResourceController.java:396)
请帮我解决这个问题。我在一个简单的java应用程序[一个主要功能]中使用了同样的方法,它工作得很好。我还在我的应用程序中创建了静态Cipher实例,用于加密和解密,但这也不起作用。
还有一件事,当我在同一个控制器方法中解密加密的对称密钥时,加密和解密发生在一个方法中,它工作正常。
我不知道我错在哪里,也不知道我错过了什么。我们将非常感谢您的帮助。谢谢
密钥大小为128的AES不是很有效。看看在部署应用程序时如何避免安装“无限强度”JCE策略文件?然后还应确保在RSA上使用2048或更多版本;)
对于使用RSA加密对称密钥,请使用Cipher。WRAP_MODE
和Cipher.wrap(key)
。默认的RSA/ECB/PKCS1Padd
只能包装密钥,不能加密"正常"数据。RSA/ECB/OAEPRetSHA-256AndMGF1Padd
应该能够正常加密,但不能包装密钥。(我不知道为什么)
我的问题就这样解决了。我已经将密码设置为静态,并在静态块中初始化它们。然后我在两种控制器方法中使用相同的密码。
private static Cipher AESCipher = null;
private static Cipher RSACipher = null;
static {
try {
AESCipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
static {
try {
RSACipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
是否可能您的私钥有误?如何验证它是否与公钥匹配?
异常严重:Servlet。路径为[z2]的上下文中servlet[dispatcher]的service()引发异常[请求处理失败;嵌套异常为org.springframework.dao.DataIntegrityViolationException:not null属性引用null或瞬时值:com.spring.entity.Product.cd;嵌套异常为org.hibernate.Prop
我得到的。 这是我的密码: 我得到错误作为 2014年10月16日下午4:31:47 严重:Servlet。路径为[/CustomerPortal]的上下文中servlet[dispatcherServlet]的服务()引发了异常[Request processing failed;嵌套异常为java.lang.NumberFormatException:null],其根本原因为 当我运行这个项目
当我尝试连接到Oracle数据库时,出现了以下问题。 有例外 此reportMapper.xml
在一个做其他事情的大型应用程序中——我需要加密和解密一个文件。所以我一直在四处寻找,并实现了这两个核心功能,基本上使用RSA密钥包装一个随机的AES密钥来加密一个文件。对称键和iv被写入文件的开头。 我在下面的解密函数部分得到一个异常(“javax.crypto.BadPaddingException:Decryption error”)。在肯安迪夫线路上——doFinal。具体来说,这一行是异常
我现在正在使用JPA eclipselink,我想用Eclipselink连接到我的数据库 我有一些类de表在我的数据库和查询来获取我的条目: 我为我的桌子做了一些课程: FDC_DBCHANGE 已执行FDC_ 和FDC_系统 当我在Tomcat上运行它时,有一个例外: 组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套异常是异
我尝试解密从Web服务接收的加密数据。 使用AES 128进行加密。 我使用以下代码对数据进行解密: 在 密码doFinal() 我得到了以下例外: javax.crypto.badpaddingexception垫块损坏 我浏览了我的帖子,但没有找到解决办法。我被困在这里了。