2012-04-17 52 views

回答

28

您不想为分组密码使用指定PKCS#7填充。你想指定PKCS#5填充。 PKCS#5被指定用于分组密码,而PKCS#7不是(它用于不同的地方,如在S/MIME中)。我将指出PKCS#5和PKCS#7实际上指定了完全相同类型的填充(它们是相同的!),但在此上下文中使用时称为#5。 :)

因此,而不是"AES/ECB/PKCS7PADDING",你想要"AES/ECB/PKCS5PADDING"。这是一个密码实现,每个Java平台的实现都需要支持。有关更多详细信息,请参阅documentation of the Cipher class

+0

非常感谢您的回答。那么JCE提供商不支持PKCS7PADDING? – 2012-04-17 15:56:40

+2

正确。它没有(好吧,因为#5和#7是相同的填充...我想你可以说它是这样做的)。而且,不客气。如果您满意,请记住接受答案。 :) – jeffsix 2012-04-17 15:57:37

+4

这个答案没问题,但有点令人困惑,因为你*想*使用PKCS#7填充分组密码。根据[Standard Algorithm Names。](http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher)PKCS,“PKCS7Padding”是错误的名称#7使用此填充方案填充用分组密码加密的消息。无论大背景是什么。 – erickson 2012-04-17 17:53:25

3

对于包括PKCS#5和PKCS#7加密标准文本中的问题的一个非常全面的解释,请看看here


PKCS#5填充表示填充1到8个字节。填充字节本身包含以字节编码的填充字节数量。 PKCS#5填充是为DES指定的,但它适用于块大小为8字节的任何块密码。

现在DES规范甚至基于密码的PKCS#5规范的加密优先于Java和Java相当长的时间。 AES在2002年才被标准化,在Java甚至Java 2引入之后很久。所以在AES出现之前,(三重)DES和PKCS#5填充已经集成到Java中。

当Java - 或者更准确地说,Sun JCE提供者 - 获得了AES功能时,它需要一个16字节块大小的填充方法。 PKCS#7指定了这种填充方法is identical to PKCS#5 padding,除了它是为2到255个字节的块大小(如果它编码基于零的无符号整数的字节的最大值)定义的。但是,填充方法已经在那里了;它被命名为"PKCS5Padding"。因此,不要引入新名称,而是简单地重新使用"PKCS5Padding"

现在,Sun提供商应该真的支持"PKCS7Padding",因为PKCS#5填充不正确。这不仅仅是Java命名问题,任何试图实现加密协议或将其他应用程序移植到Java的开发人员都会遇到问题。但现在,您应该使用"PKCS5Padding"而不是"PKCS7Padding"

相关问题