我目前正在编写一个非常小的Java程序来实现一次性pad,在该程序中,使用SECURERANDOM对象将PAD(或键)本身作为一系列字节生成,该对象使用SHA-的简单字符串播种512算法。

生成一次性pad并没有引起任何问题,如果我每次提供相同的种子弦,正如预期的那样,我会得到相同的psuedo-random数字,只要解密的人具有解密过程用来加密的种子字符串。

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

现在,因为java将所有原语都视为签名数字(数据类型 字节 从-128到127不等, 不是 0至255)这意味着XOR操作可以(并且确实)导致一些负值(-128至-1)。 Java似乎没有将这些值识别为有效的ASCII,而只是写入? (问号)到任何负值的文件。当涉及从文件读取以解密密码文本时,导致的负值?写入文件的丢失,替换为63,即问号的有效ASCII代码。

这意味着Xoring此值是没有用的,没有原始值,就无法产生明文。顺便说一句,如果我重现加密某些数据的行为,然后在同一程序运行和沿途打印状态后立即解密数据,没有问题。只有将数据写入文件是丢失的信息。

我还应该提到,我确实尝试在每个加密XOR结果中添加128个,然后在执行解密XOR之前将其减去(将每个值放在有效的ASCII范围内),但是?问题仍然出现,因为有31个ASCII代码从128到159,我无法阅读和出现?

我已经把头撞了一段时间了一段时间,任何帮助都将受到赞赏。干杯。

有帮助吗?

解决方案

这很困惑。如果您要处理一个char数组,则元素为16位,它们是未签名的,并且并非所有值都是有效的。因此(a)您可能无法在符号或字节上遇到问题,(b)您根本不应该这样做。您应该将文件读取为字节数组,XOR-ing,并将字节数组直接写入输出文件。没有读者或作家,没有字符,没有弦。

其他提示

我想问题在于您编写文件的方式。将转换的字节数组直接写入FileOutputStream,不要首先尝试将其转换为字符串。要阅读,请执行同样的事情,将其阅读给字节数组。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top