2011-08-11 55 views
3

我已經使用DES爲密鑰提供了字符串和加密文件。這是我所知道的。我不知道密鑰是如何編碼的。Java - 將字符串轉換爲DES密鑰

還有,我可以用它來解密des.exe,這是我在網上查到:http://knowledge-republic.com/CRM/2011/07/how-to-decrypt-extract-recreate-thecus-storage-firmware/

使用des.exe,它與唯一的命令是「-D」,不「-d」。

我的目標是使用Java來做同樣的事情。我從某處複製並粘貼了這個文件

String key = "blah"; 
    DESKeySpec dks = new DESKeySpec(key.getBytes()); 
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
    SecretKey desKey = skf.generateSecret(dks); 
    System.out.println(desKey); 

    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE 

    if (mode == Cipher.DECRYPT_MODE) { 
     cipher.init(Cipher.DECRYPT_MODE, desKey); 
     CipherOutputStream cos = new CipherOutputStream(os, cipher); 
     doCopy(is, cos); 
    } 

並且它不起作用。

將字符串轉換爲密鑰有哪些其他選擇?

應該加上我是一個完整的密碼學新手。

+0

您收到的密鑰是如何編碼的?它是十六進制還是base64?在將它傳遞給DESKeySpec構造函數之前,必須將該字符串轉換爲解碼的字節數組。 – stevevls

+0

是不是key.getBytes()會做什麼?我所擁有的鑰匙實際上只是一個字符串,我不確定已經做了什麼。我曾嘗試使用Base64進行解碼,並且抱怨說「Base64編碼數據中存在非法字符」。 – kouri

+0

我試圖使用UTF8,UTF16,ISO,HEX ......解碼。還有其他什麼? – kouri

回答

2

在SunOS手冊頁des(?這似乎是你的des.exe是以)表明它們鍵這樣產生的:

的DES算法要求,其低8字節鑰匙順序位被假定爲奇偶校驗位。用戶提供的ASCII密鑰被填充爲零,並且高位被設置爲奇數奇偶校驗位。然後DES算法忽略每個ASCII字符的低位,但由於奇偶校驗,該位的信息已保存在高位中。

它還提到,最初的IV總是zero'd出來,不管你是在

操作的CBC模式始終使用爲全零 的初始值運行的模式初始化向量,所以文件的前8個字節是 加密相同,無論是在CBC還是ECB模式。

它還提到使用的填充是使得最後一個字節總是從0-7的值,指示使用的填充字節數。這類似於PKCS5Padding,所以也許會工作

由於DES的CBC和ECB模式要求8個字節爲單位被 加密,文件被DES命令被加密具有1至8個字節 附加到它們使它們成爲8個字節的倍數。最後的 字節在解密時給出了最後8個字節保存的字節數(0到7),其中 被保存。附加到 輸入的那些字節的其他字節在加密之前被隨機化。

根據您所使用的選項,聽起來您正在使用DES/CBC/PKCS5Padding作爲密碼。

我認爲這只是確定如何實際派生密鑰。我在exampledepot上找到了適用於您的示例代碼。我認爲你只需要將你的字符串密碼轉換爲8個字節(每個字符1個字節,所以沒有UTF編碼),然後通過示例中的代碼來填充密鑰。無論如何,它值得一試。

+0

是的,如果這是一個聽起來像的「練習」,那麼這可能是非常有意義的,從引用的可執行文件的糟糕的文檔來看,似乎加密是des或者3cbc模式,我會試着先測試這些密碼,然後再嘗試暴力破解 – aaron

+0

我試過了你已經建議和不要,我嘗試使用「des -E -k」hello「進行加密/解密,其中」hello「是關鍵,它仍然有效,所以如果它是一個字符,那麼它會填充它與0s?它已被轉換成其他東西首先@ @ @完全卡住了,我想我將不得不稱之爲「des.exe」,而不是自己解密 – kouri

+0

是的,文檔說它填充密碼用0字節使它成爲一個完整的8.如果你不這樣做,那麼關鍵不會是相同的,你將無法解密。您還需要確保您使用的是zero'd IV,儘管這可能是默認情況下發生的(不確定)。 – senecaso

0

DES密鑰是7(顯然SunJCE使用7?)或8個字節。檢查您提供的字符串是7或8個字節。如果是這樣,那麼機會是好的,這是原始的關鍵。如果不是,它可以以某種方式編碼。對於十六進制編碼的贈品應該是前綴0x或後綴h,並且所有字符都在範圍0-9,A-F中。你當然可以從十六進制轉換爲自己或使用網絡上的一些代碼,但我通常使用Apache公共資源庫(http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex。 HTML)。

這就是說,這是真正的炒作,我不知道我們可以跳轉到它的單獨的關鍵問題的結論。你有沒有關於聲稱的加密算法的其他信息?如果可執行你引以作品「-d」,那麼它好像加密是DES平原CBC模式:

-B:在ECB加密模式下使用DES加密,的defaut是CBC模式

(有多種可能的方式,請參閱http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppA

我會嘗試設置你的密碼爲 「DES/CBC」。

話又說回來,我不知道如何解釋這一點:

默認爲特里普爾CBC

您可以使用此代碼片段告訴什麼密碼都可以在系統上:http://www.java2s.com/Code/Java/Security/ListAllProviderAndItsAlgorithms.htm

+0

我剛剛使用該des.exe進行解密和加密,唯一的命令產生相同的結果是「-E」和「-D」,其中只有最後幾個字符是不同的,使用相同的密鑰我有得到了。其餘的結果完全不同。 :(「-d」根本不起作用,你的原始密鑰是什麼意思? – kouri

+0

密鑰有8個正常字符,所以...... 8個字節?如果是正常的UTF8? – kouri

0

我有與C#相同的問題。我最終解決了這個問題。你可以看看我的答案在這裏:DES Initialization Vector in C#

一般來說,做什麼des.exe,是它計算使用DES的校驗和。因此,每個加密步驟都使用先前的結果,而不是在輸出數組中前進。