【问题标题】:IllegalBlockSizeException: Input length not multiple of 16 bytes AES/ECB/NoPadding [closed]IllegalBlockSizeException:输入长度不是 16 字节 AES/ECB/NoPadding 的倍数 [关闭]
【发布时间】:2020-11-17 19:35:29
【问题描述】:

我有这个 sn-p,不知道为什么我用这个 sn-p 得到不规则的结果。

线索:适用于少于 200 个字符的短字符串,但当字符串在 260 个字符及以上的范围内时,它会抛出 javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes

      Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
      byte[] key = "secret_key".getBytes(StandardCharsets.UTF_8);
      SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
      cipher.init(Cipher.ENCRYPT_MODE, secretKey);
      byte[] cipherText = cipher.doFinal(request.getBytes(StandardCharsets.UTF_8));
      String encryptedText = Base64.encodeBase64String(cipherText);

【问题讨论】:

    标签: java encryption cryptography aes ecb


    【解决方案1】:

    线索: Input length not multiple of 16 bytes

    请注意您已询问AES/ECB/NoPadding 密码模式。

    AES 是一种块密码 - 对每个块的数据进行加密(128 位 = 16 字节)。如果输入不是 16 字节的倍数,则使用padding 将输入长度填充为块大小的倍数。您已指定NoPadding 参数,则输入必须为16 字节的倍数。 (与长度超过 200 个字符无关)。

    另一个问题是使用ECB mode。请不要使用它,直到真的没有理由。

    我有几个examples你可以用。

    【讨论】:

    • 感谢领导,让我回顾一下。我正在处理供应商集成,因此必须符合他们的标准
    • @clifford_owino 他们需要把 something 放在最后一个字节,对吧?那么他们放了什么?对于旧的 PHP 代码,可能是零值字节?如果是这种情况,请更新您的问题。 PS,如果您不知道,解密他们使用NoPadding 创建的标准密文(当然使用正确的密钥),然后他们查看字节。
    • 加上 AES 密钥必须正好是 16、24 或 32 字节,并且不应像从 String.getBytes() 获得的情况那样仅限于有效字符;特别是它不应该是密码或密码短语——它们不是一战后加密的密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多