我对Java不是很有经验,所以这可能是一个不成熟的问题。我试图用Java加密进行一些实验,但由于某种原因,我无法获得Cipher
的实例。我总是在这一行上获得NoSuchPaddingException
,将填充更改为其他内容,例如"/NoPadding"
不起作用:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
尝试运行代码,即使Eclipse说这是错误导致此错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type NoSuchAlgorithmException
Unhandled exception type NoSuchPaddingException
at Encryption.main(Encryption.java:10)
可能是什么问题?我必须输入某些东西吗?在当前代码中我import javax.crypto.Cipher
和javax.crypto.spec.SecretKeySpec
。
当我使用Jython时,代码会顺便运行。
答案 0 :(得分:4)
已从GeneralSecurityException
扩展的例外情况(包括NoSuchPaddingException
和NoSuchAlgorithmException
)是已检查的例外情况。已检查的异常是必须在Java中处理的异常。您可以通过多种方式处理异常:
throws
子句; RuntimeException
包裹起来(基本上以不必处理的方式升级异常,通常导致应用程序失败); 通常,对于NoSuchAlgorithmException
和NoSuchPaddingException
,您可以将例外升级为RuntimeException
,例如IllegalStateException
。通常,您的算法字符串保持静态,并且Java运行时环境需要支持"AES/CBC/PKCS5Padding"
,因此只有在出现严重错误时才会出现此异常。
如果您不想单独处理这些例外,您可以捕获GeneralSecurityException
或使用multi catch子句。解密方法期间BadPaddingException
和IllegalBlockSizeException
表示输入失败,因此应单独处理(并记住填充oracle攻击)。
请注意,Jython作为一种不同的语言,不使用已检查的异常,因此异常只会导致程序失败...
示例:
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
} catch(GeneralSecurityException e) {
throw new IllegalStateException("Could not retrieve AES cipher", e);
}
答案 1 :(得分:0)
您使用的方法会抛出异常,因此您需要使用try
catch
块来处理它,
使用,
try{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
}
catch(Exception e){
//print some thing
}