2017-05-04 5 views
0

JavaでCBC(Cipher Block Chaining)からXORを実装する方法は? 私は両方の値がブール値であるときにそれを行う方法を知っていますが、ブール値ではなく数値がある場合はどうしますか?例についてはCipher Block Chaining:JavaでのXOR実装

i1 = 15 
i2 = 4 

I XOR I1とI2はどうすればよいですか? short整数使っ

+1

可能な複製(http://stackoverflow.com/questions/726652/creating-a-logical-exclusive-or-operator-in-java) –

+0

ええけど私はXORブール値にしたくない。私はXORの数値にしたい:D – sunnyboy4205

+0

それはブール型と整数型で動作します。 –

答えて

4

Javaにはビット単位のXOR演算子が組み込まれています(Java Language Specificationを参照)。 XORは、すべての基本積分型(つまり、あなたと私の数値を直接表す型)、つまりbyte,short,int,longおよびに対応しています。このXOR演算子は、同じ位置のビットのXORをビットごとに行い、その結果を出力します。 ^=もあり、結果を左側の変数に保存します。

これは、バイトまたは32ビット整数(int)でこれを行う場合、CBCの実装に依存します。通常はバイトを使用しますが、32ビット構造を使用してAESを実装した場合は、整数を使用します。整数はやや速くなりますが、XORがかかる時間はブロック暗号操作と比較して淡くなります。

したがって、暗号化中に最後の暗号文の各バイトと各バイトをXORするか、暗号化中の最後の暗号文とその結果(復号化後)をXORするだけです解読中に次の暗号文。


あなたはJavaは自動的にオペランドをupcastsとして、2つのバイト値のXOR演算を使用している場合、バイトにキャストバックする必要があるかもしれない - そのため結果 - 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で符号付きの値です。これは、負の値を持つ可能性があることを意味します。ただし、ビット単位の操作を使用している限り、これを無視することはできます。これは、加算や乗算などの数学演算の際にのみ重要です。 [Javaで「排他的論理和または」オペレーターの作成]の

+1

バイトまたはショーツに再度ダウンキャストする必要があることを示すために[Ammar](http://stackoverflow.com/a/43792996/589259)に行ってください。 –

1

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

これは、2つのショートパンツをXORするための最も効率的な方法です。 BigIntegerを作成するオーバーヘッドに陥ることはなく、s1とs2の両方が最初から短くなっているため、キャストでオーバーフローの問題が発生することはありません。

+0

ただし、ショーツを使用する理由は絶対にありません。 –

関連する問題