1

我需要使用双倍长度的 3DES 密钥来加密随机的 8 个字节,然后使用加密的值来派生一个新的 3DES 密钥。

当我尝试使用 encryptedRandomValue 实例化 DESedeKeySpec 时,我收到一条错误消息“密钥大小错误”。你能告诉我如何解决这个问题吗?

DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue);

如果我所有的 SecretKey 都是单个 DES 密钥,我可以避免出现此错误。但我需要使用双长 3DES 密钥和 ECB 模式。

这是我的代码;

    // Generate double length 3DES Master Key
    KeyGenerator masterEncKeyGenerator = KeyGenerator.getInstance("DESede");
    masterEncKeyGenerator.init(112);
    SecretKey masterKey = masterEncKeyGenerator.generateKey();

    //Prepare random bytes
    byte[] randomKeyValue = "rn4yrbdy".getBytes();

    // Encrypt random bytes with the 3DES Master key
    final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, masterKey);
    byte[] encryptedRandomValue = cipher.doFinal(randomKeyValue);

    // Derive new key 3DES Key
    SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede");
    DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue);
    SecretKey derivedKey = mySecretKeyFactory.generateSecret(myKeySpec);

我意识到为什么我会收到这个错误。这是因为 DESedeKeySpec 需要接受 24 个字节作为密钥材料,但我只给它 8 个。但这就是我的要求:生成一个未加密的 3DES 密钥,使用主 3DES 密钥,随机 8 字节数据......

4

1 回答 1

4

三重 DES 只是使用不同的密钥完成的 3 个连续的单个 DES 操作。具体来说,它是 DES 加密,然后是 DES 解密,然后是 DES 加密。

DES e ncrypt- d ecrypt- e ncrypt是它的名字DESede

双倍长度和三倍长度密钥之间的区别在于您在三个 DES 操作中的每一个操作中使用的密钥部分。

双长度密钥:k1 || k2将给出以下 DES 操作:

Encrypt(k1) - Decrypt(k2) - Encrypt(k1)

三倍长度密钥:k1 || k2 || k3将给出以下 DES 操作:

Encrypt(k1) - Decrypt(k2) - Encrypt(k3)

Java 中的标准实现不直接支持双长度三重 DES 密钥,但您可以通过将密钥的第一部分作为第三部分重复来获得相同的效果:k1 || k2 || k1

出于好奇,您可以通过三重 DES 支持单 DES 加密,方法是将单个 DES 密钥重复三次,例如:k1 || k1 || k1. 这简化了例如硬件实现中的反向兼容性。

于 2017-03-09T00:28:59.993 回答