AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 与 256 密钥大小性能 java
Posted
技术标签:
【中文标题】AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 与 256 密钥大小性能 java【英文标题】:AES/CBC/PKCS5Padding vs AES/CBC/PKCS7Padding with 256 key size performance java 【发布时间】:2014-01-13 05:42:55 【问题描述】:我目前正在使用AES/CBC/PKCS5Padding
加密具有 256 字节 密钥大小的 Java 文件,但在搜索时我在 stackexchange PKCS#5-PKCS#7 Padding 上找到并提到了,
PKCS#5 填充是 8 字节块大小的 PKCS#7 填充的子集
所以我想知道
-
对于上述配置,
AES/CBC/PKCS7Padding
的性能会比AES/CBC/PKCS5Padding
更好吗?
如前所述,我们如何在 Java 中配置块大小
PKCS#7 填充适用于从 1 到 255 字节的任何块大小。
我的示例代码是,
SecureRandom rnd = new SecureRandom();
IvParameterSpec iv = new IvParameterSpec(rnd.generateSeed(16));
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256);
SecretKey k = generator.generateKey();
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, k, iv);
【问题讨论】:
【参考方案1】:块大小是所用密码算法的属性。对于 AES,它总是 16 个字节。
严格来说,PKCS5Padding 不能与 AES 一起使用,因为它仅定义为 8 字节的块大小。我假设,AES/CBC/PKCS5Padding 在内部被解释为 AES/CBC/PKCS7Padding。
这些填充方案之间的唯一区别是 PKCS7Padding 将块大小作为参数,而对于 PKCS5Padding,它固定为 8 个字节。当块大小为 8 字节时,它们的作用完全相同。
【讨论】:
如果我使用AES/CBC/PKCS7Padding
而不是AES/CBC/PKCS5Padding
会有什么不同
@dbw 我不这么认为。但可以肯定的是,请查看文档。
但我不认为 AES/CBC/PKCS5Padding
被解释为 AES/CBC/PKCS7Padding
好像我读过 Cipher 它被提到 AES/CBC/PKCS5Padding (128)
所以这一定是定义了一些机制
@dbw 有趣的是,标准名称文档只讨论了PKCS5Padding
。似乎是一个历史错误,因为这在DES
次是正确的。实际上这两种填充算法是相同的,唯一的区别是 PKCS7 有块长度作为参数,而 PKCS5 固定为 8 个字节。
PKCS5Padding 在密码规范中被解释为 PKCS7Padding 的同义词。它只是一个历史产物,Sun 决定简单地假装 PKCS5Padding 与 PKCS7Padding 的含义相同,用于块大小大于 8 字节的块密码,而不是改变它。以上是关于AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 与 256 密钥大小性能 java的主要内容,如果未能解决你的问题,请参考以下文章