密码块链接:Java 中的 XOR 实现

Cipher Block Chaining: XOR implementation in Java

如何在 Java 中实现 CBC(密码块链接)的 XOR? 我知道当我的两个值都是布尔值时该怎么做,但是如果我有数字而不是布尔值,我该怎么办?

例如:

i1 = 15
i2 = 4

如何XOR i1 和 i2?

使用 short 个整数:

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

这是将两个短裤异或在一起的最有效方法。它不会 运行 创建 BigIntegers 的开销,并且转换永远不会导致溢出问题,因为 s1 和 s2 都是短裤。

Java 内置了按位异或运算符,请参阅 Java Language Specification。 XOR 适用于所有原始整数类型(即直接代表你我的数字的类型):byteshortintlongchar .该异或运算符将对相同位置的位进行按位异或,然后输出结果。还有 ^= 会将结果存储回左侧变量。

现在,如果您要对字节或 32 位整数 (int) 执行此操作,则取决于您对 CBC 的实现。通常您会使用字节,但如果您使用 32 位结构实现 AES,您将使用整数。整数会稍微快一些,但是与块密码操作相比,XOR 所花费的时间无论如何都会显得苍白无力。

所以你可以简单地有一个 for 循环(以字节为单位的块大小)和 XOR 最后一个密文的每个字节与加密期间的下一个明文或最后一个密文与结果 -解密后 - 解密期间的下一个密文。


当对两个字节值使用 XOR 运算时,您可能需要转换回一个字节,因为 Java 会自动将操作数 - 因此结果 - 向上转换为 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 中的带符号值,这意味着您可能会得到负值。不过没关系,只要您只使用按位运算,就可以忽略它。它仅在加法或乘法等数学运算中很重要。