2017-03-08 136 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