为什么在Vigenere Cipher算法的解密输出中会出现随机的未定义字符?

时间:2018-12-30 03:48:12

标签: javascript encryption undefined vigenere

我正在使用JavaScript开发自己的Vigenere密码。我很享受。无论如何,加密和解密是相同的,只不过decrypt()是'-'keyStr而不是底部的'+'。加密效果完美。但是,由于某种原因,在解密时,某些字符随机地以未定义的形式出现。我知道该算法适用于C ++,Python,Java和Swift。这是什么错误?

我尝试在字母数组中打印char索引,并且crypto()中的索引值变得奇怪,我不知道为什么。

function ascii(x) {
return x.charCodeAt(0);
}

function decrypt() {
var alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var msgStr = "";
var keyTemp = "";
var keyStr = "";
var output = "";
var input = document.getElementById("inMsg").value;
var key = document.getElementById("key").value;

input = input.toUpperCase();
key = key.toUpperCase();

for(let i = 0; i < input.length; i++) {
    for(let x = 0; x < alpha.length; x++) {
        if (input[i] == alpha[x]) {
            msgStr += alpha[x];
        }
    }
}

for(let i = 0; i < msgStr.length; i++) {
    keyTemp += key[i % key.length]
}

for(let i = 0; i < keyTemp.length; i++) {
    for(let x = 0; x < alpha.length; x++) {
        if (keyTemp[i] == alpha[x]) {
            keyStr += alpha[x];
        }
    }
}

for(let i = 0; i < msgStr.length; i++) {
    let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;
    output += alpha[x];
}

document.getElementById("outMsg").value = output;
}

1 个答案:

答案 0 :(得分:3)

您遇到的问题是由以下行引起的:

let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;

因为

ascii(msgStr[i]) - ascii(keyStr[i])

可以为负。

%运算符实际上不是javascript中的模数运算符,它不是余数运算符,而是works a little differently

在上面的链接中,您应该能够执行以下操作使其正常工作:

 let x = ((ascii(msgStr[i]) - ascii(keyStr[i])) % 26) + 26) % 26