2010-10-09 117 views
1

我目前正在写一个非常小的Java程序来实现一次性垫,其中垫(或键)本身使用SecureRandom对象为一系列字节产生后丢失数据,它使用SHA-512算法使用简单的字符串进行播种。XOR加密在Java中:解密

生成一次性pad没有造成任何问题,并且如果我每次提供相同的种子串,如期望的那样,我得到相同的伪随机数序列,只要解密过程可行就可以该人员解密具有用于加密的种子字符串。

当我尝试加密一个文件时,程序每次读入数据64个字符(文件结尾除外,通常是一个奇数),并生成psuedo的64个字节(或匹配数量)随机字节。在两个阵列的元素之间执行XOR,将生成的包含密码字符的char数组写入文件,并重复该过程直到文件中的所有文本都被读取。

现在,因为Java将所有原语为有符号数(数据类型字节范围从-128到127, 0到255),这意味着XOR操作可以(而且确实)导致一些负面值(-128到-1)。看起来Java不会将这些值识别为有效的ASCII码,而只是写一个? (问号)到文件的任何负值。当从文件读取密文解密时,负值导致了?写入文件丢失,用63代替问号的有效ASCII码。

这意味着,异或该值是没用的,没有原始值是没有办法,以产生明文。顺便说一下,如果我再现了一些数据加密行为,然后立即解密数据,在同一程序运行中以及沿途的打印状态,则没有问题。只有在数据写入文件时才会丢失信息。

我还要提到的是我没有尝试添加128到每个加密XOR结果,然后进行解密XOR(放在一个有效的ASCII范围内的每个值)之前减去,但?问题仍然出现,因为从128到159有31个ASCII码,我无法读取并显示为?

我一直在敲打我的头在墙上的这一段时间,现在,任何帮助表示赞赏。 干杯。

+0

发布一些代码。另外,它真的*写了一个问号,或者是你的文本编辑器如何解释非ASCII字符? – Dave 2010-10-09 22:15:00

+2

字节不是字符。异或字节工作得很好,把它们当作字符是不正确的。 – 2010-10-09 22:25:55

+0

非常感谢,伙计们。通过FileInputStream读入一个字节数组并使用FileOutputStream写出就像一个魅力。看到它的工作让我感到欣慰,只是因为我自己没有把它弄清楚而被我的愚蠢所抵消。感谢帮助。 – 2010-10-10 02:24:12

回答

1

这是非常困惑。如果你正在处理一个char数组,那么元素的宽度是16位,它们是无符号的,并不是所有的值都是有效的。所以(a)你不可能遇到符号或字节的问题,(b)你根本就不应该这样做。您应该将文件读入一个字节数组中,异或,并将字节数组直接写入输出文件。没有读者或作家,没有字符,没有字符串。

1

我想这个问题是在你写的文件的方式。将转换后的字节数组直接写入FileOutputStream,不要尝试先将其转换为字符串。为了阅读,做同样的事情,把它读到一个字节数组中。