【问题标题】:Wrong cipher text length when using 3DESede with PKS5 padding of javax.crypto使用带有 javax.crypto 的 PKS5 填充的 3DESede 时,密文长度错误
【发布时间】:2017-02-14 22:13:10
【问题描述】:

我在我的 android 应用程序中使用以下代码来加密 Triple DES 中的字符串,使用 Encrypted Code Book (ECB) 模式和三个独立的密钥(又名 3DESede),它们以 24 字节大小的密钥数组的形式提供。因此我使用Java Crypto API。这工作得很好,但是如果我加密一个 8 个字符的字符串,我会得到一个 16 字节的密文,这不应该发生,因为 3DES 在 64 位(相应的 8 字节)块上运行。 PKCS5 padding 同样适用,因为它也适用于 64 位块。所以我的问题是导致这个问题的原因是什么?

private static byte[] encryptText(String plaintext, byte[] keyBytes) throws Exception {
    // Get plaintext as ASCII byte array
    final byte[] plainBytes;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        plainBytes = plaintext.getBytes(StandardCharsets.US_ASCII);
    } else {
        plainBytes = plaintext.getBytes("US-ASCII");
    }

    // Generate triple DES key from byte array
    final DESedeKeySpec keySpec = new DESedeKeySpec(keyBytes);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
    SecretKey key = keyFactory.generateSecret(keySpec);

    // Setup the cipher
    final Cipher c3des = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    c3des.init(Cipher.ENCRYPT_MODE, key);

    // Return ciphertext
    return c3des.doFinal(plainBytes);
}

【问题讨论】:

  • 1.最好不要在新代码中使用 3DES,AES 是当前的对称加密标准。 2.不要使用ECB模式,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密,它不需要不保密。 3. 加密容易,使用安全难。

标签: java android encryption 3des


【解决方案1】:

PKCS5Padding 在与 DES 一起使用时添加 1-8 字节的填充。如果您加密 8 个字节,您将获得 8 个额外的填充字节以达到偶数个块。

如果你使用Cipher.getInstance("DES/ECB/NoPadding")并加密了8个字节,你将得到8个字节的密文。

【讨论】:

    【解决方案2】:

    当使用 PKCS#5 填充时,它必须始终添加填充,否则在解密时将无法确定是否添加了填充。因此,即使输入数据是块大小的精确倍数,也必须添加填充,这将是 8 个字节。

    PKCS padding:

    如果原始数据是 N 字节的整数倍,则添加一个额外的值为 N 的字节块。这是必要的,因此解密算法可以确定地确定最后一个块的最后一个字节是否是一个填充字节,它指示添加的填充字节数或明文消息的一部分。考虑一个明文消息,它是 N 字节的整数倍,明文的最后一个字节是 01。没有附加信息,解密算法将无法确定最后一个字节是明文字节还是填充字节。然而,通过在 01 明文字节之后添加 N 个字节,每个值 N,解密算法总是可以将最后一个字节视为填充字节,并从密文末尾剥离适当数量的填充字节;根据最后一个字节的值,要剥离的字节数。

    PKCS#5 填充与 PKCS#7 填充相同,只是它仅针对使用 64 位(8 字节)块大小的块密码定义。在实践中,两者可以互换使用。

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2019-04-14
      • 2012-05-16
      相关资源
      最近更新 更多