我正在用 javascript 构建凯撒密码。它使用一个名为 currentkey
的随机设置变量作为密码的 key 。它可以是从 -25 到 +25 的数字,跳过 0。
我不明白为什么该函数会在字符串的开头返回 undefined,或者为什么它会在字符串运行时一直翻译同一个字母,甚至为什么那个字母根本没有被翻译。
var currentkey = 5 //for example
function convertKey(str) {
var o_text = str;
var o_letters = o_text.split("");
var alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','y','w','z']
var c_text, _x = "";
for (x in o_letters) {
if (currentkey > 0) {
_x = alphabet[alphabet.indexOf(x) + currentkey]
} else {
_x = alphabet[alphabet.indexOf(x) + (26 - currentkey)]
}
c_text = c_text + _x;
}
return c_text;
}
例如,运行 convertKey("example")
返回 undefinedeeeeeeee
(undefined + 7 乘以“example”中的第一个字母)。
最佳答案
在 JavaScript 中实现凯撒密码算法非常有趣,因为 JavaScript 缺少真正的模运算符。 % 只是 split 的提醒。阅读此 article以获得更多解释。
但是,您可以轻松地将模数定义为自定义函数,然后继续执行凯撒密码 - 这是一种非常简单的加密形式,其中原始消息中的每个字母都向左或向右移动一定数量的职位。
为了解密消息,我们只需将字母向后移动相同数量的位置。
例子:
- 如果我们将所有字母移动 3 个位置,JAVASCRIPT 将变为 MDYDVFULSW
- 如果我们将所有字母向后移动 3 个位置,MDYDVFULSW 将返回到 JAVASCRIPT。
如果一个字母在移位后超出了字母的范围,那么这个字母就会在字母表中环绕。示例:字母 Z 移动 3 个位置后变为 C。
这种“环绕”效果意味着使用模数。用数学术语来说,上述内容可以表示为:
En(x) = (x + n) mod 26
Dn(x) = (x – n) mod 26
在不使用适当的模运算符的情况下尝试在 JavaScript 中实现此算法将产生不正确的结果或非常神秘且难以理解的代码。
通过使用自定义模函数,代码以相同的方式表达数学方程式:
// Function will implement Caesar Cipher to
// encrypt / decrypt the msg by shifting the letters
// of the message acording to the key
function encrypt(msg, key)
{
var encMsg = "";
for(var i = 0; i < msg.length; i++)
{
var code = msg.charCodeAt(i);
// Encrypt only letters in 'A' ... 'Z' interval
if (code >= 65 && code <= 65 + 26 - 1)
{
code -= 65;
code = mod(code + key, 26);
code += 65;
}
encMsg += String.fromCharCode(code);
}
return encMsg;
}
// Implement modulo by replacing the negative operand
// with an equivalent positive operand that has the same wrap-around effect
function mod(n, p)
{
if ( n < 0 )
n = p - Math.abs(n) % p;
return n % p;
}
玩得开心!
加密几条消息以试用代码。请记住:如果您使用正 key 加密,请使用互补的负 key 对其进行解密。您还可以使用此代码来解码那些出现在网络和新闻组中各处的 ROT13 消息。
如果您想了解在 JavaScript 中实现模的其他方法,请参阅本文开头提到的文章。
关于javascript - javascript : cipher broken 中的凯撒密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748954/