Java中的密码填充字符串是什么?

34

大家都在谈论密码中的填充方案,但实际上需要传递给密码的字符串是什么?我不关心它们是对称的还是非对称的,我只想要一个可能值的列表。


1
那将是一个无限列表。 - bmargulies
1
不是在谈论盐。我想要一个可能的填充列表,例如:NOPADDING、ANSIX923Padding、PKCS5Padding、PKCS7Padding、ISO10126Padding等等。为什么没有一个包容性的清单呢? - Roy Hinkley
@bmargulies 不,不会有无限的列表。该列表仅限于您系统支持的Java提供程序实现。根据Sani下面的答案,默认情况下该列表是有限的。如果您想通过不同的提供程序实现获得其他算法、模式和填充方案的额外支持,则可以在代码中明确执行此操作。但是,您必须加载该依赖项。Bouncy Castle就是一个例子。 - user4903
1
这个问题表面上似乎要求使用实际字节进行填充,而不是算法标识符。 - bmargulies
2
@bmargulies 这样怎么样?“实际字符串是什么”在问题中是明确的! - Roy Hinkley
显示剩余3条评论
2个回答

55
有许多类型的填充,例如PKCS-7、Zero、ISO 10126、ANSI X.923等。
我建议您阅读有关填充的内容,因为您似乎并没有完全理解这个概念。

然后可能是您在提到加密

编辑
Java平台的每个实现都需要支持以下标准Cipher转换,其中括号中为密钥大小:

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5Padding (128)
  • AES/ECB/NoPadding (128)
  • AES/ECB/PKCS5Padding (128)
  • DES/CBC/NoPadding (56)
  • DES/CBC/PKCS5Padding (56)
  • DES/ECB/NoPadding (56)
  • DES/ECB/PKCS5Padding (56)
  • DESede/CBC/NoPadding (168)
  • DESede/CBC/PKCS5Padding (168)
  • DESede/ECB/NoPadding (168)
  • DESede/ECB/PKCS5Padding (168)
  • RSA/ECB/PKCS1Padding (1024、2048)
  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024、2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024、2048)

您可以在这里找到一个列表。

编辑2
您可以在这里找到Bouncy Castle规范。它列出了所有可用的填充方案。


2
我理解这个概念以及其中有许多类型。我遇到的困难是找到在特定情况下使用的有效字符串。我也理解什么是盐!如果您的答案包括一个有效字符串列表的链接,那将非常有帮助。 - Roy Hinkley
你似乎并没有完全理解这个概念,因为你在询问“有效的字符串列表”。对于每种填充类型,“列表”都是不同的。对于零填充来说,它非常简单:0、00、000、0000、0000等。你需要了解不同类型的填充。 - Sani Huttunen
4
为什么我需要将算法、模式和填充方式作为字符串传递给提供程序以获取加密实例呢?比如:"AES/CTR/PKCS5Padding"。 - Roy Hinkley
1
谢谢,我已经拥有所有的算法和模式,我只需要一个全面的填充方案列表。这个列表是所有Java平台的基本实现,当然还有其他的。特别是我正在使用Bouncycastle与Microsoft堆栈进行互操作。你能指引我去找他们的填充方案吗?他们的文档没有列出可能接受的字符串,至少我没有找到。 - Roy Hinkley

12

块密码需要填充,而流密码不需要。块密码需要填充是因为它们加密整个数据块,而您的消息可能不完全匹配整数块。填充用于将消息长度扩展到下一个块边界。

详见维基百科关于密码填充的文章。

大多数情况下使用PKCS#7(又称PKCS#5)填充:n个字节,全部值为n:

01
02 02
03 03 03
...
10 10 10 10 ... 10 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接