2017-05-04 42 views
0

如何在Java中使用CBC(密碼塊鏈接)實現XOR? 當我的兩個值都是布爾值時,我知道該怎麼做,但如果我有數字而不是布爾值,該怎麼辦?密碼塊鏈接:Java中的XOR實現

例如:

i1 = 15 
i2 = 4 

我如何XOR I1和I2?

+1

[在Java中創建一個「邏輯排他或」運算符]的可能的副本(http://stackoverflow.com/questions/726652/creating-a-logical-exclusive-or-operator-in-java) –

+0

是的但是我不想XOR布爾值。我想要XOR數字:D – sunnyboy4205

+0

它適用於布爾類型和整型類型。 –

回答

4

Java有一個按位異或運算符內置,請參閱Java Language Specification。 XOR適用於所有原始整數類型(即直接表示您和我的數字的類型):byteshort,int,longchar。這個XOR運算符將在相同的位置執行位的異或運算,然後輸出結果。還有^=將結果存回左手變量。

現在它取決於你的CBC的實現,如果你要在字節或32位整數(int)上執行此操作。通常你會使用字節,但是如果你已經使用32位構造實現了AES,你可以使用整數。整數會稍微快一些,但是無論如何,XOR需要的時間與塊密碼操作相比將會變得蒼白。

因此,您可以簡單地使用for循環(最大爲字節塊大小),並將最後一個密文的每個字節與下一個明文進行XOR加密,或者在加密過程中將下一個明文與最後一個密文進行XOR運算(解密後)下一個密文在解密期間。


您可能需要使用XOR操作時,轉換回一個字節的兩個字節的值,因爲Java自動upcasts操作數 - 因此結果 - 對32位整數(int):

byte x = 0b0011; // 0b indicates a binary literal 
byte y = 0b0101; 
byte r = (byte) (x^y); // results in 0b0110 or the value 6 in decimals 

字節是Java中的有符號值,表示您可能會得到負值。沒問題,只要你只是使用按位操作就可以忽略這個。在數學運算中,如加法或乘法,這只是重要的。

+1

感謝[Ammar](http://stackoverflow.com/a/43792996/589259)表示您需要再次下載回字節或短褲。 –

1

使用short的整數:

short s1 = ... 
short s2 = ... 
short result = (short) (s1^s2); 

這是異或XOR兩個短褲在一起的最有效方式。它並沒有陷入創建BigInteger的開銷之中,因爲s1和s2都是短褲,所以演員不會造成溢出問題。

+0

然而絕對沒有理由使用短褲。 –