关于字节数组的XOR运算的字符串长度

时间:2012-03-21 07:22:07

标签: java encryption xor

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

此致 弥兰陀

2 个答案:

答案 0 :(得分:3)

要编码只是从纯文本中移动字节数组,必要时使用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);

答案 1 :(得分:2)

(如评论中所述,你不应该将它用于任何真实的东西。从头开始正确加密是非常困难的 - 不要自己动手,使用现有的实现。)

当谈到字符串时,真的没有“XOR”这样的概念。 XOR指定给定两个的结果,而文本不是由位组成 - 它由字符组成

现在你可以只取每个字符的Unicode表示(整数)并将这些整数异或 - 但结果很可能是不是任何有效字符串的有效Unicode表示。

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

如果你有两个字节数组,你可以轻松地将它们一起异或 - 如果它比另一个短,可能循环回到其中一个的开始,这样结果总是和更长的数组相同。但是,即使两个输入都是(例如)UTF-8编码文本,结果通常也不是有效的UTF-8编码文本。如果必须以文本形式显示结果,我建议在那时使用Base64 - 有一个public domain base64 encoder,它有一个简单的API。