带AES/ECB128/PKCS5Padding的密码总是抛出“没有这样的算法”异常

带AES/ECB128/PKCS5Padding的密码总是抛出“没有这样的算法”异常

问题描述:

有没有人知道这段代码有什么问题?带AES/ECB128/PKCS5Padding的密码总是抛出“没有这样的算法”异常

Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE"); 
  • 算法:AES
  • 操作方式:欧洲央行(与128附加到指定块大小)
  • PaddingSchemce:PKCS5Padding

这似乎是正确的我,但它不断在实例化过程中抛出“No such algorithm”异常。

+2

您不能在'ECB'之后输入数字,因为该模式仅支持每个加密的完整块。你只能在有意义的模式之后放置一个数字,比如CFB,OFB和CTR模式。 –

什么也没有,但我的类路径股票JDK,我跑这个代码片断,并在输出grepped为AES:

for (Provider provider: Security.getProviders()) { 
    System.out.println(provider.getName()); 
    for (String key: provider.stringPropertyNames()) 
    System.out.println("\t" + key + "\t" + provider.getProperty(key)); 
} 

我看到这行:

Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING 

这表明我你的填充支持。

我也看到了这条线:

Cipher.AES SupportedModes  ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128 

我注意到,欧洲央行出现在这里,但ECB128没有,所以我不知道如果是这样的问题。我要承认我不知道这些信息是否正确。

编辑添加: 我可以用ECB而不是ECB128调用Cipher.getAlgorithm(“AES/ECB/PKCS5Padding”)。它看起来像我与ECB一样,你不能指定块的大小,至少在这里有什么可用的。不知道这对你是否足够。

+0

谢谢。但是我查看了JDK文档,他们说附加的数字应该是IN BYTES的长度。所以我猜'ECB16'应该可以工作。 –

+1

@OneTwoThree虽然JCA [Cipher转换](http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#trans)doc表示_you可以选择指定通过将该编号附加到模式名称_一次来处理位,并非所有模式都支持它。请参阅JCA [标准算法名称文档](http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html)中的“密码算法模式”部分。 –

+0

@一二三,大家知道,CBC比欧洲央行更安全。虽然你将不得不处理一个初始化向量。 –

Sun JCE提供程序有所限制。尝试使用BouncyCastle JCE提供程序(http://www.bouncycastle.org/)。

+0

我其实从未使用Sun JCE以外的任何提供程序。所以如果我想使用BoyncyCastle。我应该把他们的名字放在ctor吗? –

+1

这里肯定不需要。 –

+0

要添加提供者,您可以将其添加到您的java.security文件中,也可以通过编程方式添加它。以下是关于bouncycastle.org网站的说明:http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation。另外你应该在oracle的网站上查看关于JCA/JCE的ORACLE文档以获取详细信息。 – Sanjeev

AES的静态块大小为128位(或16字节)。 Rijndael,用于创建AES的密码确实具有多个块大小。在调用init方法期间配置密钥时,密钥大小会自动拾取。

模式后面的位不用于配置密码的块大小。它们用于配置Cipher Feedback (CFB) mode of operation的反馈大小。但现在这是一个相当模糊的模式,特别是如果不是所有的块加密位都被使用的话。尽管它们也可以正式用于OFB模式may be security issues when specifying smaller feedback sizes。应该保留这两种模式以提供对传统协议的支持。

如果使用的话,"CFB""OFB"字符串后面的值应该大于0且不大于块大小,增量为8.该数字被指定为反馈位的数量,并且 - 像大多数加密API一样 - Java的JCE仅限于处理字节。