【问题标题】:Java not adding PKCS5 paddingJava 未添加 PKCS5 填充
【发布时间】:2017-09-06 04:51:00
【问题描述】:

我对@9​​87654321@ 填充的理解是,它们在加密之前将字节添加到纯文本中,因此最后一个块已满。一旦密文被解密,就会检查最后一个块,填充字节标记哪些字节是填充的,哪些是纯文本。

当我在 Java 中使用 128 位 AES 和 PKCS5 加密 8 个字节(小于一个块)时,doFinal() 的结果只有 8 个字节。

是没有应用 PKCS7,还是我错过了它的工作原理?

Random secureRandom = new SecureRandom();

byte[] ctr = new byte[16];
byte[] keyBytes = new byte[16];

secureRandom.nextBytes(ctr);
secureRandom.nextBytes(keyBytes);

IvParameterSpec ivSpec = new IvParameterSpec(ctr);
Key key = new SecretKeySpec(keyBytes, "AES");

byte[] plainText = new byte[8];

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

byte[] cipherText = cipher.doFinal(plainText);
System.out.println(cipherText.length);

8

【问题讨论】:

    标签: java cryptography aes pkcs#7


    【解决方案1】:

    您正在使用 CTR(计数器)模式,这是一种“流密码”模式。您的密文将与纯文本的长度相同。在 CTR 模式下,通过加密连续的计数器值来创建伪随机流。此流与纯文本流进行异或运算以生成密文流。

    实际上,我有点惊讶加密提供者接受除 NoPadding 之外的任何规范并结合 CTR 模式。

    【讨论】:

    • 开发人员不能很好地处理错误也就不足为奇了,看看PKCS5Padding,开发人员懒得支持正确的PKCS7Padding选项从而造成混乱:他们不在乎(不重要)!
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2019-06-17
    • 2021-01-20
    • 2022-06-10
    • 2021-08-16
    • 2017-04-08
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多