2010-10-09 180 views
1

我目前正在寫一個非常小的Java程序來實現一次性墊,其中墊(或鍵)本身使用SecureRandom對象爲一系列字節產生後丟失數據,它使用SHA-512算法使用簡單的字符串進行播種。XOR加密在Java中:解密

生成一次性pad沒有造成任何問題,並且如果我每次提供相同的種子串,如期望的那樣,我得到相同的僞隨機數序列,只要解密過程可行就可以該人員解密具有用於加密的種子字符串。

當我嘗試加密一個文件時,程序每次讀入數據64個字符(文件結尾除外,通常是一個奇數),並生成psuedo的64個字節(或匹配數量)隨機字節。在兩個陣列的元素之間執行XOR,將生成的包含密碼字符的char數組寫入文件,並重復該過程直到文件中的所有文本都被讀取。

現在,因爲Java將所有原語爲有符號數(數據類型字節範圍從-128到127, 0到255),這意味着XOR操作可以(而且確實)導致一些負面值(-128到-1)。看起來Java不會將這些值識別爲有效的ASCII碼,而只是寫一個? (問號)到文件的任何負值。當從文件讀取密文解密時,負值導致了?寫入文件丟失,用63代替問號的有效ASCII碼。

這意味着,異或該值是沒用的,沒有原始值是沒有辦法,以產生明文。順便說一下,如果我再現了一些數據加密行爲,然後立即解密數據,在同一程序運行中以及沿途的打印狀態,則沒有問題。只有在數據寫入文件時纔會丟失信息。

我還要提到的是我沒有嘗試添加128到每個加密XOR結果,然後進行解密XOR(放在一個有效的ASCII範圍內的每個值)之前減去,但?問題仍然出現,因爲從128到159有31個ASCII碼,我無法讀取並顯示爲?

我一直在敲打我的頭在牆上的這一段時間,現在,任何幫助表示讚賞。 乾杯。

+0

發佈一些代碼。另外,它真的*寫了一個問號,或者是你的文本編輯器如何解釋非ASCII字符? – Dave 2010-10-09 22:15:00

+2

字節不是字符。異或字節工作得很好,把它們當作字符是不正確的。 – 2010-10-09 22:25:55

+0

非常感謝,夥計們。通過FileInputStream讀入一個字節數組並使用FileOutputStream寫出就像一個魅力。看到它的工作讓我感到欣慰,只是因爲我自己沒有把它弄清楚而被我的愚蠢所抵消。感謝幫助。 – 2010-10-10 02:24:12

回答

1

這是非常困惑。如果你正在處理一個char數組,那麼元素的寬度是16位,它們是無符號的,並不是所有的值都是有效的。所以(a)你不可能遇到符號或字節的問題,(b)你根本就不應該這樣做。您應該將文件讀入一個字節數組中,異或,並將字節數組直接寫入輸出文件。沒有讀者或作家,沒有字符,沒有字符串。

1

我想這個問題是在你寫的文件的方式。將轉換後的字節數組直接寫入FileOutputStream,不要嘗試先將其轉換爲字符串。爲了閱讀,做同樣的事情,把它讀到一個字節數組中。