2011-03-25 34 views
2

我有一個可執行文件,用於解密用戶輸入的二進制數據。我的任務是恢復解密算法而不看可執行文件的源代碼。我已經完成了大約50次解密嘗試,並且通過結果判斷,算法顯然很容易(類似於XOR,但更改輸入數據的一個字節通常影響輸出的兩個字節),密鑰的長度肯定是16字節,但我仍然無法恢復它。成功解密提示

所以,我的問題是:是否有成功恢復解密算法的任何提示?一些指導方針或任何其他幫助將不勝感激。

這裏有一些真實的例子,我可以看到那裏的規律性,但我無法理解整個算法。如果我輸入多於16個字節(例如17個零字節),則輸出字節序列重複。左邊是我輸入的內容,右邊是我得到的(一切都是十六進制):

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -> 73 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 65 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 -> 94 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 66 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 -> 93 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 75 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 -> 83 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 76 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 -> 83 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 A9 64 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 -> 94 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 BA 55 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 -> 94 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 B9 54 
00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 -> 94 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 75 A8 64 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 -> 73 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 63 

P.S.這不是常識中的「黑客攻擊」。我正在爲一個不明確的格式(.bmd)編寫一個3D模型查看器,但其中一些模型是加密的,所以我想實現自己的內部解密器而不是使用外部可執行文件。

+0

對於除1和0以外的十六進制值的輸入有任何示例嗎? 「00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02」給你什麼? – 2011-03-25 18:38:52

+0

@Null設置,是的,當然。它給了我'73 36 15 B9 95 5D 8E EA 01 72 1C F4 FA 76 AA 63',我將它添加到示例列表中。 – Joulukuusi 2011-03-25 19:53:00

+1

不發明自己的密碼是一個很好的實物教訓,因爲有人(在這種情況下@Angel和SO社區)會破壞它們。 ;) – 2011-03-28 06:22:13

回答

2

你的做法是相當正確的。如果我們假定它是一個16字節的塊加密,它確實是一個異或代碼,你可以進行如下操作(注意:所有的計算都做模2):

  • 輸入塊是128位,輸出模塊還加密可以用一個128x128二進制矩陣來描述E:out = e(in)= E * in + e(0)
  • E中的每一行基本上告訴你如果你改變了哪些位會在輸出中翻轉輸入中的相應位。
  • 您可以使用您的方法獲得E和e(0),並分別設置一位並計算輸出。因此,您可以逐行獲取矩陣E,即您需要128個輸入值來收集完整的矩陣。 e(0)只是零串的編碼。
  • 然後用矩陣D定義解密d(out)= D *(out-e(0))。 * in + e(0)-e(0))= D * E * in。
  • 因此,我們必須計算加密矩陣E的二進制逆。對於這個問題有已知的算法(例如參見http://en.literateprograms.org/Binary_matrix_%28Java%29)。

編輯:我檢查了你給出的例子是否符合假設。如果它是一個普通的XOR代碼,我們在輸入和輸出上會有XOR [第一行,第二行,第三行,第四行] = 0。 XOR [第1行,第5行,第6行,第7行] = 0相同。在提供的有限數據中,除了輸出中的前8位外,所有位都保持爲真(無論如何只有少數位受到影響, )。不幸的是,目前我無法告訴你更多有限的數據。

+0

我完全理解你的假設和結論,非常感謝你!我還注意到輸出的第一個字節有一個奇怪的行爲,經過一些研究,我發現問題出在哪裏。這就是解密的可執行文件失敗,它使用相同的文件顯示不同的輸出,並且差異僅僅是第一個字節。只有第一次使用可執行文件時才顯示正確的輸出。所以,你的假設是絕對正確的,現在我要得到二進制矩陣E.再一次,非常感謝你! – Joulukuusi 2011-03-25 21:12:34

1

可執行文件有多大 - 你可以反彙編它,並從中解密這個解密嗎?

也許張貼一些例子,說明爲什麼你認爲它的工作原理,你的思維方式 - 其他人可能發現的東西...

+0

可執行文件大約500kb,用Delphi編寫。我已經成功地對它進行了反編譯,但是我需要花很多時間才能理解彙編語言,可能不僅僅是解密。至於示例,我會在幾分鐘內更新問題。感謝您的興趣。 – Joulukuusi 2011-03-25 16:13:27