DESedeKeySpec密钥大小错误

时间:2017-03-08 22:35:46

标签: java encryption 3des secret-key key-generator

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

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

DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue);

如果我的所有SecretKeys都是单个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字节数据......

1 个答案:

答案 0 :(得分:3)

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

DES e ncrypt- d ecrypt- e ncrypt的名称为 DESede

双倍长度和三倍长度键之间的差异是你在三次DES操作中使用的密钥的哪一部分。

双倍长度密钥:k1 || k2将提供以下DES操作:

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

tripple length key:k1 || k2 || k3将提供以下DES操作:

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

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

作为好奇心,您可以通过三次DES重复单个DES密钥来支持单DES加密:k1 || k1 || k1。这简化了例如后缀兼容性。硬件实现。