gpt4 book ai didi

java - Java中的异或加密: losing data after decryption

转载 作者:行者123 更新时间:2023-11-30 05:09:38 29 4
gpt4 key购买 nike

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

生成一次性填充并没有引起任何问题,如果我每次提供相同的种子字符串,正如预期的那样,我会得到相同的伪随机数序列,只要满足解密者拥有用于加密的种子字符串。

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

现在,因为 Java 将所有基元视为有符号数字(数据类型字节范围从 -128 到 127,不是0 到 255),这意味着 XOR 运算可以(并且确实)导致一些负值(-128 到 -1)。 Java 似乎无法将这些值识别为有效的 ASCII,而只是简单地写了一个 ? (问号)到文件中是否有任何负值。当涉及到从文件中读取以解密密文时,导致 ? 的负值。写入文件的内容丢失,替换为 63,即问号的有效 ASCII 代码。

这意味着对该值进行异或是没有用的,没有原始值就无法生成明文。顺便说一句,如果我在同一程序运行中重现加密某些数据然后立即解密数据的行为,并一路打印状态,则没有问题。只有将数据写入文件,信息才会丢失。

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

我已经为此绞尽脑汁有一段时间了,非常感谢任何帮助。干杯。

最佳答案

这很困惑。如果您正在处理 char 数组,则元素为 16 位宽,它们是无符号的,并且并非所有值都有效。所以(a)你不可能有符号或字节的问题,(b)你根本不应该这样做。您应该将文件读入字节数组,进行异或运算,然后将字节数组直接写入输出文件。没有读者或作家,没有字符,没有字符串。

关于java - Java中的异或加密: losing data after decryption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898075/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com