2013-05-03 26 views
4

衆所周知,可以扭轉MT回火功能。源代碼可以在線獲得,請點擊這裏here。我試圖弄清楚它是如何工作的,以及如何以程序化的方式處理這個問題和類似的問題。是什麼讓梅森扭轉者回火功能可逆?

我在掙扎的是,對有限大小的變量進行移位操作會導致不可逆的數據丟失。同樣,位操作也會導致永久性數據丟失,但所提供的sample code可以將任何值反轉爲原始的預鍛鍊狀態!

另一件事是,我覺得困惑,是無動作的轉變操作是在同樣的方向&量作爲臨時工功能。

回答

5

考慮一個Feistel network的結構。基本的操作原理是將數據分成兩部分,並將一部分散列到一個掩碼中以排除或排入另一部分。即使哈希本身不是,這也是可逆的。在解密期間,使用相同的(可能具有破壞性的)散列操作來生成與以前相同的掩碼,並且該散列操作被排除在另一部分上,從而將其恢復到其原始值。這個操作可以通過不同的分割來重複,這樣所有的比特都有機會影響其他所有比特,並且鏈只需要反向重放來解密。

類似地,破壞性位移和位和僅用作專用或掩碼,用於排列原始值的完整副本。

k ^= k >> 11意味着採取k的前21位,並排除或排除在k的底部21位。 k的前11位保持不變,我們可以通過將它們重新排列在這些位上來恢復k的後11位。然後我們可以使用這些新發現的k原始位來恢復其餘k的原始值。

+0

謝謝@ sh1 - 一個非常有用的解釋。你最後一段中的「21」是否是一個錯字?如果不是,我真的迷路了...... – 2015-04-13 20:03:36

+1

不,我的意思是21.「k」是一個32位的值,右移11表示最後的11位將被丟棄,只留下前21位移位後的位(如'21 + 11 = 32')。那些21位將被對齊到字的最低有效位用於異或操作;但請記住,該表達式來自_en_編碼操作。要解碼,你需要使用11位塊。 – sh1 2015-04-13 21:52:39