2017-03-08 260 views
0

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

当我尝试实例与encryptedRandomValue的DESedeKeySpec,我得到一个错误信息“错误的密钥大小”。你能告诉我如何解决这个问题吗?

DESedeKeySpec myKeySpec =新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密钥和随机8字节数据生成加密的3DES密钥...

回答

2

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

DESË ncrypt- d ecrypt- ê ncrypt是什么给它的名字DESede

betwheen双长度和特里普尔长度键的区别是关键的哪一部分你在三个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。这简化了例如后置词的兼容性。硬件实现。

+0

Ebbe,非常感谢您的回复。我从你的回答中了解到,我没有正确创建双倍长度的密钥...因此,要获得正确的双倍长度密钥,我需要使用KeyGenerator.getInstance(“DESede”)创建一个密钥;然后取出它的前8个字节并连接成一个新的字节[]和第二个8字节,然后再前8个字节,并生成一个新的DESede SecretKey? – Simplyi

+0

是的,这将创建一个3DES密钥,该密钥等同于前16个字节中的双倍长度密钥。 –

+0

谢谢你的安息。如果我创建的不是一个DESede密钥,而是两个单独的DES密钥:密钥和密钥2,然后将这两个密钥连接成一个字节数组,并尝试从这些字节中生成一个新的DESede密钥。请问这仍然是一个有效的双倍长度3DES键?....并且在用这个3DES密钥加密一个随机的8字节数组后,如果我试图推导出一个新的3DES密钥,那么它会不会给我一个错误,正如我在上面发布的示例中那样... DESedeKeySpec只需要24个字节,但是3DES削片器的输出仅为8字节......并且它给了我一个错误... – Simplyi