【问题标题】:XOR two strings in JAVAJAVA中的两个字符串异或
【发布时间】:2013-03-19 01:11:50
【问题描述】:

我正在尝试加密一个字符串,其中一部分是用 IV 字符串对文本进行异或。 在遇到一些困难后,我最终进入了 stackoverflow,其中一个人给出了以下代码:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;

public class StringXORer {

public String encode(String s, String key) {
    return base64Encode(xorWithKey(s.getBytes(), key.getBytes()));
}

public String decode(String s, String key) {
    return new String(xorWithKey(base64Decode(s), key.getBytes()));
}

private byte[] xorWithKey(byte[] a, byte[] key) {
    byte[] out = new byte[a.length];
    for (int i = 0; i < a.length; i++) {
        out[i] = (byte) (a[i] ^ key[i%key.length]);
    }
    return out;
}

private byte[] base64Decode(String s) {
    try {
        BASE64Decoder d = new BASE64Decoder();
        return d.decodeBuffer(s);
    } catch (IOException e) {throw new RuntimeException(e);}
}

private String base64Encode(byte[] bytes) {
    BASE64Encoder enc = new BASE64Encoder();
    return enc.encode(bytes).replaceAll("\\s", "");

}
}

除了 2 个问题外,它似乎有效: 结果字符串变长。当试图在“abcdefgh”和“abcdefgh”之间进行异或时,我得到:“aaaaaaaaaaaa”。 其次,两个相同字符串的结果变为“aaaa....” - 字符串“a”s....

所以这两个问题是:

  1. 为什么结果字符串变长了?
  2. 为什么相同字符串之间的异或结果由“a”列表组成...?

这是作业,感谢任何帮助。

谢谢!

【问题讨论】:

  • 为什么...你在使用sun.misc.BASE64Decoder
  • 我不是。它带有代码,所以我把它放在那里,直到确定我不需要它为止。
  • 也许这会对你有所帮助:stackoverflow.com/questions/1205135/…

标签: java string encryption xor


【解决方案1】:

字符串变长了,因为除了与密钥进行异或之外,它还被Base64 编码。

将对base64Encode(...) 的调用替换为new String(...),将base64Decode(s) 替换为s.getBytes(),以获得原始的异或字符串。但请注意,编码后的字符串在打印时看起来不太好。与自身异或的字符串将由\0 字符组成,这些字符打印为空格。

即使在更改之后,getBytes() 也可能返回比字符串长度更长的字节数组,具体取决于平台默认字符集。例如。 UTF-8 会将 >= 128 的字符编码为两个或三个字节。使用 ISO-8859-1 作为字符集,字符 new String(...) 可能无法生成预期的字符,因为给定的字节对于平台默认编码无效。

【讨论】:

  • 我按照你告诉我的做了,它有效,但在 30 轮之后就坏了。我想添加屏幕截图,但不知道如何在此处添加,所以我上传了带有屏幕截图的 zip 文件:2shared.com/file/O4B5MctP/steps.html 你可以在那里看到整数。在第 50 轮左右,它变得太慢了,而且在我出现一些记忆错误之后的某个地方——这就是我首先问这个问题的原因。知道那里发生了什么吗?顺便说一句,IV 在 CBC 加密方案中不断变化(XOR 的结果变成新的 IV)。
  • 你能检查用相同的密钥加密然后解密一个字符串会产生原始字符串吗?如果失败,您可能需要使用 getBytes()new String() 方法指定 charSet "ISO-8859-1"。请参阅 JavaDoc 了解如何执行此操作。
  • 它确实产生了原始字符串。感谢您的帮助。
  • @DanaRoot 我的建议解决了您的问题吗?如果是这样,你应该接受我的回答。如果没有,您可以提供更多详细信息,例如您是否在其他地方找到了原因。既然这是家庭作业,你自己可能不感兴趣,这也没关系。
猜你喜欢
  • 2011-07-04
  • 2011-08-31
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多