javascript - javascript : cipher broken 中的凯撒密码

标签 javascript string for-in-loop encryption

我正在用 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/

相关文章:

javascript - 黑鸟记录器 - 绝对没有任何反应

javascript - 修改 Chart.js 中条形图的 X 轴标签 2

Javascript For/in 循环不起作用 - 对象属性未定义错误

java - 尝试创建一个循环,在添加错误值时要求更正

string - 子串算法

arrays - Swift 使用 for-in 循环替换数组中的字符串

javascript - 将值从 openjscad 传递到 javascript

javascript - Grunt 从我的脚本和 CSS 中删除异步和延迟

string - 为什么简单的 Go 应用程序占用大量内存

java - ByteArrayOutputStream 到字符串数组