2010-01-19 96 views
4

我想寫一個非常簡單的實現Java中的洋蔥路由器(但包括chaum混合)的 - 大量的公共/私人密鑰加密似乎很簡單,但在努力理解如何最後的路由器會知道最後的洋蔥皮已經「剝皮」了。一個非常簡單的實現一個洋蔥路由器

我想有某種形式的校驗和也被編碼,使每個路由器試圖與自己的私鑰解密,如果校驗作品 - 轉發的新去皮的洋蔥到下一個路由器。只有這樣,(假設每次解密成功時都會剝離一些校驗和),將會有一種方法(查看校驗和)來估計解密有多接近 - 這是一個主要的漏洞?校驗和方法是否適當簡化?

+0

這似乎比Java更普遍.... – skaffman 2010-01-19 23:04:42

+0

計劃把它寫在java中 - 所以,如果有任何特定的資源,我可以使用它... – oneAday 2010-01-19 23:06:31

回答

0

你提的問題不論,這是通常很好的做法,包括一些,只要你加密/解密數據的完整性檢查。然而,校驗和並不適合這一點。看看安全哈希算法,如SHA-256(有標準Java加密框架內置的實現)。

現在,回到你原來的問題......到了洋蔥的每一個節點,你要通過加密的「包」,但數據包將不僅僅包括實際數據傳遞on--它會包含下一個節點的詳細信息,哈希碼以及其他任何內容......包括任何標誌/指示,以表明下一個「節點」是洋蔥路由器還是實際的最終主機。事實上,最後一個節點的數據必須有一些特殊的信息,即與實際通信的最終主機的細節。換句話說,最後一個節點知道洋蔥已經被剝皮了,因爲你在它最終收到的數據中編碼了這個事實。

或者至少,我認爲這就是我會做... ;-)

注:加密本身並不複雜,我不認爲,但可能有一兩個細節要小心。例如,在一個普通的單一客戶端 - 服務器對話中,你必須小心的一個細節就是永遠不要用相同的密鑰對相同的數據塊進行兩次加密(或者至少,這就是它歸結爲「研究」塊模式「和」初始化向量「,如果你不熟悉這個概念)。在單個客戶端 - 服務器對話中,客戶端和服務器可以規定初始化向量的一部分。在洋蔥路由器中,必須找到其他解決方案(最糟糕的情況是,使用由客戶端生成的強生成隨機數,我想)。

0

您可以通過將它們存儲在環陣列中,其初始偏移隨機被選擇時,洋蔥中構建的隱藏校驗的數量。等同地,您可以在每次解密後循環移動該陣列。