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的主要内容,如果未能解决你的问题,请参考以下文章

AES/CBC/PKCS5Padding对称加密

nodejs中aes-128-cbc加密和解密

AES/CBC/PKCS5 填充 |替代 PHP OpenSSL 中的 mcrypt_get_block_size()

Java中的AES加解密

AES加密解密在JAVA和ANDROID下互通

AE怎么导出无背景的SVG