【问题标题】:How do you handle the shift on a Caesar cipher in Javascript?您如何处理 Javascript 中凯撒密码的转换?
【发布时间】:2016-04-23 18:29:22
【问题描述】:

我正在尝试在 Javascript 中创建凯撒密码,但无法弄清楚如何进行转换。可能是我的方法使其复杂化,但我试图了解如何设置添加数字的最大值,但从最小数字开始继续添加。这是我的代码:

$(document).ready(function(){
var alpha = [];
var encoded = [];
alpha = {
    '1': 'a',
    '2': 'b',
    '3': 'c',
    '4': 'd',
    '5': 'e',
    '6': 'f',
    '7': 'g',
    '8': 'h',
    '9': 'i',
    '10': 'j',
    '11': 'k',
    '12': 'l',
    '13': 'm',
    '14': 'n',
    '15': 'o',
    '16': 'p',
    '17': 'q',
    '18': 'r',
    '19': 's',
    '20': 't',
    '21': 'u',
    '22': 'v',
    '23': 'w',
    '24': 'x',
    '25': 'y',
    '26': 'z'
};
$('#cipher_form').submit(function(event){
    event.preventDefault();
    var input = $('#cipher_input').val();
    var key = $('#cipher_key').val();
    var chars = input.split('');
    for(var i = 0; i<chars.length; i++){
        console.log(chars[i]);
        for(var index in alpha){
            if(alpha[index] == input[i]){
                encoded.push(index);
            }
        }
    }

    for(var i=0; i<encoded.length; i++){
        alert(encoded[i]);

    }

});
});

所以当表单提交时,我会抓取输入值,并将其转换为字符数组。然后我遍历我的对象并找到与字符匹配的键值对并将键推送到另一个数组。我的计划是遍历我的密钥数组并将 cipher_key 添加到该数字。

因此,如果我的对象中的字母“o”是“15”,而我的 cipher_key 是“5”,它将添加 15+5 并以“20”结尾,即“t”。我看到的问题是,如果我的字母是“z”并且你加上 26 + 5,你最终会得到 31,这在我的对象中不存在。

我的挑战是找出如何将 cipher_key 添加到我的号码一直到 26,但如果超过 26,请重置并从 1 开始并继续添加。因此,如果字母为“z”且 cipher_key 为“5”,则需要 26+5 并以字母“e”结束。

这可能吗?还是我的方法在这方面完全错误?

【问题讨论】:

  • 我会使用基于零的结构,然后使用剩余运算符 % 将数字移动到正确的范围。另一点是使用一个对象,就像你拥有的一样,用于字母到数字的查找。 {'A': 0, 'B': 1, ...}

标签: javascript arrays encryption caesar-cipher


【解决方案1】:

只需将数字放在简单的数组中,但要按顺序排列。
var alpha = ['a', 'b', 'c', ... 'z']
获取其数值为var value = alpha.indexOf(the_number);
然后添加密码密钥并使用% 防止超出您的金额。
var newNumValue = (value + key) % 26; 我想就是这样。它涵盖了这个问题。除此之外 - 你的方法很好,是的。
不同的方法
另外 - 如果您的文本可能包含一些特殊符号,我建议从ASCII table 获取初始值。它将涵盖所有符号以及不同的小写和大写字母。而且您不需要存储该数组。
var value = yourChar.charCodeAt(0);
要从 ascii 代码中取回符号,请转到 var symbol = value.fromCharCode();
希望这会有所帮助。

【讨论】:

  • 谢谢!这让我朝着正确的方向前进。
  • 专业提示。要获取字符数组,您可以声明一个字符串并在之后将其拆分:var alpha = 'abcde...'.split('');
  • 好的,但请理解 fromCharCodecharCodeAt 使用 Unicode/UTF-16(如 Java、.NET、...)。而不是 ASCII。
猜你喜欢
  • 2019-04-26
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2014-02-06
相关资源
最近更新 更多