我已经对这个问题进行了很多研究并最终理解了这一点,使用XOR加密和解密并不是建议的加密方式,但因为这是一个学术问题,我必须这样做。
在我的场景中,我必须逐行在文件(.txt文件)中保存java对象(通过我们选择的键使用xor加密的空格分隔字符串),并在以后检索它们(如果需要)。因此,在文件中保存xor字符串不是问题,但是在删除它时会被截断。下面是我为我的项目实现的类似代码示例。
public class TestingXor {
private static String XorString(String input){
String key = "computing";
Charset charSet = Charset.forName("UTF-8");
byte[] inputBytes = input.getBytes(charSet);
byte[] keyBytes = key.getBytes(charSet);
for(int i=0;i<inputBytes.length;i++){
inputBytes[i] = (byte)(inputBytes[i] ^ keyBytes[i%keyBytes.length]);
}
return (new String(inputBytes,charSet));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
File testFile = new File("addressBook.txt");
Scanner scanObj = new Scanner(testFile);
String testString = "asd asdasd 07/08/2015 asdasdasd 198546125";
BufferedWriter writer = new BufferedWriter(new FileWriter(testFile));
writer.write(XorString(testString));
writer.close();
System.out.println(XorString(scanObj.nextLine()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以上代码返回&#34; asd为&#34;我需要整个字符串。如果我没有保存文件我能够正确加密和解密,但如果我将字符串保存到文件并从文件中检索字符串并解密它确实没有工作。我认为它与保存字符串(\ 0保存在行中间)有关,但是围绕这个工作是什么。当我从文件中读取时,我不知道字符串的长度。如果此问题已经得到解答,您可以将我重定向到该问题。
答案 0 :(得分:0)
问题是你;using built-in recursion combinators (mapcar & reduce)
(defun χ² (expected observed)
(reduce #'+ (mapcar (lambda (e o) (/ (square (- o e)) e)) expected observed)))
;using loop
(defun chi-sqr (expected observed)
(loop
for e in expected
for o in observed
summing (/ (square (- o e)) e)))
方法可以返回包含换行符或其他行分隔符字符的String(基本上是XorString
和文件的结尾。运气不好,你的测试生成多个' \ r'使\r\n\u2028\u2029\u0085
停止寻找字符串的其余部分。
摆脱这种情况的一种方法是使用某种逃避机制。例如,Scanner
提供了这样的机制,但随意实现自己的机制。
小例子:
Properties