与字节数组的XOR操作有关的字符串长度



我正在创建一个加密算法,将对两个字符串进行异或运算。虽然我知道如何将两个字符串异或,但问题在于长度。我有两个字节数组,一个用于大小可变的纯文本,然后是56字节的键。我想知道的是,对两个字符串进行异或运算的正确方法是什么。将它们连接成一个二进制字符串并对这两个值进行异或?让每个字节数组的位置异或一个串接二进制值的键等。非常感谢您的帮助。

谨致问候,Milinda

要进行编码,只需从纯文本中移动字节数组,根据需要使用mod%运算符重复键。请确保在两端使用相同的字符集。从概念上讲,我们重复这样的键,忽略编码。

hello world, there are sheep
secretsecretsecretsecretsecr

加密

String plainText = "hello world, there are sheep";
Charset charSet = Charset.forName("UTF-8");
byte[] plainBytes = plainText.getBytes(charSet);
String key = "secret";
byte[] keyBytes = key.getBytes(charSet);
byte[] cipherBytes = new byte[plainBytes.length];
for (int i = 0; i < plainBytes.length; i++) {
    cipherBytes[i] = (byte) (plainBytes[i] ^ keyBytes[i
            % keyBytes.length]);
}
String cipherText = new String(cipherBytes, charSet);
System.out.println(cipherText);

要解密,只需颠倒过程。

// decode
for (int i = 0; i < cipherBytes.length; i++) {
    plainBytes[i] = (byte) (cipherBytes[i] ^ keyBytes[i
            % keyBytes.length]);
}
plainText = new String(plainBytes, charSet); // <= make sure same charset both ends
System.out.println(plainText);

当涉及到字符串时,实际上并没有"XOR"这样的概念。XOR指定给定两个的结果,而文本不是由位组成的,而是由字符组成的。

现在,可以只取每个字符的Unicode表示形式(一个整数),并将这些整数异或在一起,但结果很可能是一个整数序列,而不是任何有效字符串的有效Unicode表示形式。

现在还不清楚你是否以正确的方式开始思考——你说的是有字符串,但也有56个字节。您可能有一个字符串的编码表示(例如,将字符串转换为UTF-8的结果),但这不是一回事。

如果你有两个字节数组,你可以很容易地将它们异或在一起——如果其中一个比另一个短,也许可以循环回到其中一个的开头,这样结果总是与较长的数组相同的长度。然而,即使的两个输入都是(比如)UTF-8编码的文本,结果通常也不会是有效的UTF-8编码文本。如果必须以文本形式得到结果,我建议在这一点上使用Base64-有一个公共域Base64编码器,它有一个简单的API。

最新更新