Java 中所有 UTF-8 字符的维吉尼亚密码

caw*_*caw 3 java encryption cryptography vigenere

我有一个简单的函数,用于通过 Java 中的 Vigen\xc3\xa8re 加密字符串。我省略了解密,因为这只是计算新值的行中的“-”而不是“+”。

\n\n

但此功能仅适用于普通字母AZ。如何更改该函数以使其支持小写字母以及大写字母和所有其他 UTF-8 字符?

\n\n
public static String vigenere_encrypt(String plaintext, String key) {\n    String encryptedText = "";\n    for (int i = 0, j = 0; i < plaintext.length(); i++, j++) {\n        if (j == key.length()) { j = 0; } // use key again if end reached\n        encryptedText += (char) ((plaintext.charAt(i)+key.charAt(j)-130)%26 + 65);\n    }\n    return encryptedText;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

非常感谢您的帮助!

\n

Maa*_*wes 5

好吧,你问了,我觉得很费解,但是打印出密文你就知道你刚才问的是什么了……

public static String vigenereUNICODE(String plaintext, String key, boolean encrypt) {

    final int textSize = plaintext.length();
    final int keySize = key.length();

    final StringBuilder encryptedText = new StringBuilder(textSize);
    for (int i = 0; i < textSize; i++) {
        final int plainNR = plaintext.codePointAt(i);
        final int keyNR = key.codePointAt(i % keySize);

        final long cipherNR;
        if (encrypt) {
            cipherNR = ((long) plainNR + (long) keyNR) & 0xFFFFFFFFL;
        } else {
            cipherNR = ((long) plainNR - (long) keyNR) & 0xFFFFFFFFL;
        }

        encryptedText.appendCodePoint((int) cipherNR);
    }

    return encryptedText.toString();
}
Run Code Online (Sandbox Code Playgroud)

编辑:请不要在生产代码中使用,因为我不知道代码点是否确实可以编码/解码。据我所知,并不是所有的点都已被定义,而且标准是一个不断变化的目标。