Java Cipher NoSuchPaddingException

时间:2014-03-23 10:38:37

标签: java encryption aes

我对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.Cipherjavax.crypto.spec.SecretKeySpec

当我使用Jython时,代码会顺便运行。

2 个答案:

答案 0 :(得分:4)

已从GeneralSecurityException扩展的例外情况(包括NoSuchPaddingExceptionNoSuchAlgorithmException)是已检查的例外情况。已检查的异常是必须在Java中处理的异常。您可以通过多种方式处理异常:

  1. 在您的方法中添加throws子句;
  2. 抓住它并使用原始文件将RuntimeException包裹起来(基本上以不必处理的方式升级异常,通常导致应用程序失败);
  3. 抓住它,用它做一些有用的事情,然后继续前进。
  4. 通常,对于NoSuchAlgorithmExceptionNoSuchPaddingException,您可以将例外升级为RuntimeException,例如IllegalStateException。通常,您的算法字符串保持静态,并且Java运行时环境需要支持"AES/CBC/PKCS5Padding",因此只有在出现严重错误时才会出现此异常。

    如果您不想单独处理这些例外,您可以捕获GeneralSecurityException或使用multi catch子句。解密方法期间BadPaddingExceptionIllegalBlockSizeException表示输入失败,因此应单独处理(并记住填充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
}