gpt4 book ai didi

java - 如何使用字节数组作为键对字符串进行异或?

转载 作者:行者123 更新时间:2023-11-29 18:31:30 26 4
gpt4 key购买 nike

我正在尝试使用 XOR 加密对字符串进行编码,并使用 byte array 作为 key :

String encodedString = myString XOR myKey

我在密码学方面没有太多经验,所以我还没有找到实现这一目标的方法。

作为这个问题的更新,我发现 myKey 也是一个字符串,并且与 myString 具有相同的长度>

最佳答案

String encodedString = myString XOR myKey

这是不正确的。 Java 中的字符串可以有任何编码。字符串的编码是使用特定字符编码以字节为单位的表示,即字节数组。

所以你会这样做:

byte[] encodedString = myString.getBytes(StandardCharsets.UTF_8);

检索字节。

然后您可以使用索引遍历 encodedString 的字节。您将获得二进制 key 中相同位置的字节并将两个字节异或在一起。结果可以放入与 encodedString 大小相同的新数组中。请注意,Java 有点奇怪,因为您可能需要转换回字节值才能这样做,即 result[i] = (byte) xorResult

通常,如果 key 中的字节用完,则必须再次将 key 中的索引重置为零。如果发生这种情况,您的加密方案将变得容易受到攻击,因为一次一密 (OTP) 是安全的,但 XOR 密码肯定不是。

解密后,这与加密操作相同,您可以使用以下方法取回您的字符串:

String myString = new String(encodedString, StandardCharsets.UTF_8);

显然,如果键是字符串,则您必须对键执行相同的操作。但是请注意,即使 key 很好地分布在可打印 字符上,位值 也可能没有很好地分布。换句话说,作为 XOR key 的字符串使您容易受到加密分析,尤其是对位和字节的频率分析。


XOR 会产生随机字节,因此您可能需要进行 base 64 编码(加密后)/解码(解密前)以获得密文字符串而不是字节数组。


我特意省略了执行此操作的代码,因为这是一项练习作业,祝您实现愉快!

关于java - 如何使用字节数组作为键对字符串进行异或?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032759/

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