我需要使用双倍长度的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密钥...
Ebbe,非常感谢您的回复。我从你的回答中了解到,我没有正确创建双倍长度的密钥...因此,要获得正确的双倍长度密钥,我需要使用KeyGenerator.getInstance(“DESede”)创建一个密钥;然后取出它的前8个字节并连接成一个新的字节[]和第二个8字节,然后再前8个字节,并生成一个新的DESede SecretKey? – Simplyi
是的,这将创建一个3DES密钥,该密钥等同于前16个字节中的双倍长度密钥。 –
谢谢你的安息。如果我创建的不是一个DESede密钥,而是两个单独的DES密钥:密钥和密钥2,然后将这两个密钥连接成一个字节数组,并尝试从这些字节中生成一个新的DESede密钥。请问这仍然是一个有效的双倍长度3DES键?....并且在用这个3DES密钥加密一个随机的8字节数组后,如果我试图推导出一个新的3DES密钥,那么它会不会给我一个错误,正如我在上面发布的示例中那样... DESedeKeySpec只需要24个字节,但是3DES削片器的输出仅为8字节......并且它给了我一个错误... – Simplyi