【发布时间】:2012-05-04 01:40:57
【问题描述】:
我有这个简单的函数,用于通过 Java 中的 Vigenère 加密字符串。我省略了解密,因为这只是计算新值的行中的“-”而不是“+”。
但此功能仅适用于普通字母 A-Z。如何更改函数以使其支持小写字母以及大写字母和所有其他 UTF-8 字符?
public static String vigenere_encrypt(String plaintext, String key) {
String encryptedText = "";
for (int i = 0, j = 0; i < plaintext.length(); i++, j++) {
if (j == key.length()) { j = 0; } // use key again if end reached
encryptedText += (char) ((plaintext.charAt(i)+key.charAt(j)-130)%26 + 65);
}
return encryptedText;
}
非常感谢您的帮助!
【问题讨论】:
-
你想支持什么样的字符? UTF-8 是一种支持所有 unicode 字符的编码,其中许多字符甚至不会以您喜欢的字体打印。此外,Vigenère 密码并不真正适合任何现代密码学……为什么要将其应用于现代编码?当然,只支持 52 个大写/小写字符很容易......
-
如果可能,我希望支持所有 unicode 字符以提供最佳兼容性。字体中丢失的字符没有问题,因为加密的数据永远不会被打印,而只会被存储。我想使用它,因为它简单、快速并且可以很容易地用各种编程语言实现(具有可互换的结果)。
-
使用 unicode 的可互换结果,你确定吗?您可以将每个字符解释为 32 位 unicode 代码点。然后,密钥将是 32 位数字的随机字符串。但是,最好为纯文本描述 UTF-8,为密文描述 Base64 编码,然后使用任何简单的密码(如果你真的必须 让它变得简单和破碎)。
-
Unicode 定义了代码点,这是一个不断增长的“字母”。这可以使用例如编码UTF-8。您需要定义一个组来进行模数计算。对于 Unicode,这不会太容易发生。我将向您展示另一个使用两个组(高和低)的答案,但我强烈建议您考虑加密字符编码(字节)而不是字符,即使是简单的混淆技术。
-
简单快速,是的,但也是微不足道的。请不要将它用于任何重要的事情。
标签: java encryption cryptography vigenere