【问题标题】:Cipher/decipher textArea text using XOR使用 XOR 加密/解密文本区域文本
【发布时间】:2026-01-12 13:40:01
【问题描述】:

我有一个代码,它应该在按下按钮后使用某种字符串键从我的 textArea 中加密文本。问题是,这种方法只能使用一个字符而不是整个字符串来加密文本。我需要更长的密钥,所以这里需要字符串。我该如何改变呢?

btnCipher.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent klik) {
        String textToCipher = textArea.getText();
        String cipherKey = textField.getText();

        String cipheredText = "";
        int xor;
        char temp;

        for (int i=0; i<textToCipher.length(); i++){
            xor = textToCipher.charAt(i)^cipherKey; //error
            temp = (char)xor;
            cipheredText += temp;
        }
        textArea.setText(cipheredText);
    }
});

【问题讨论】:

标签: java string char xor encryption


【解决方案1】:

将该行更改为:

xor = textToCipher.charAt(i) ^ cipherKey.charAt(i % cipherKey.length);

正如this post 中提到的,虽然 String 类并不介意存储带有不成对代理项的字符串(这实际上对 UTF-16 格式无效),但您将在其他字符集中编码/解码字符串时遇到麻烦以及使用代码点相关方法时。

【讨论】:

  • 此操作会“异或”字符值,但可能会产生无效的 UTF-8 字符。
  • @ErstwhileIII:Java 中的字符串 有点 UTF16,因为它允许不成对的代理。真正的 UTF-16 不允许代理。
【解决方案2】:

如果您的字符串采用 UTF-8 编码,那么在两个字符串之间使用互斥或​​(暂时假设长度相等)可能不会产生有效的 UTF-8 结果(特别是,如果出现以下情况,您可以创建一个“延续”字符您在同一位置有“a”和“æ”)。查看here 进行更深入的讨论。

您要处理的用例是什么?

【讨论】:

  • 我只需要对一些标准文本进行编码,以显示使用 java 的这种可能性 :)
  • @user3235376: 问题是,当你在 Java 中取回一个 String 对象并可以将它输出到屏幕上时,当你将它写到流中保存它时会遇到麻烦在某些设备上。
  • 试图理解“降级”是为了说明一个事实,即在 UTF 字符串上使用“异或”会产生无效的 UTF 字符串,以防人们想要显示编码的字符串。
  • 虽然说任何 UTF 编码都具有无效序列是正确的(用于 UTF-16 和 UTF-32 中的代理,或者表明 UTF-8 有更多字节),使用 UTF-8 中的反例来劝阻在这里实际上不起作用,因为 String 类使用 UTF-16 来表示字符串,而 'a' ^ 'æ' 恰好产生了一个有效的 UTF-16 字符。