为什么我的 Vigenere Cipher 算法的解密输出中会出现随机的未定义字符?
Why am I getting random undefined chars in my decryption output in my Vigenere Cipher algorithm?
我正在使用 JavaScript 编写自己的 Vigenere Cipher。我很喜欢。无论如何,加密和解密是相同的,除了 decrypt() 是 '-' keyStr 而不是底部的 '+'。加密工作完美。但是,由于某种原因,在解密时,一些字符随机出现为未定义。我知道该算法适用于 C++、Python、Java 和 Swift。这里有什么错误?
我尝试打印字母表数组中的字符索引,但 decrypt() 中的索引值出现奇怪的结果,我不明白为什么。
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;
}
您遇到的问题是由以下行引起的:
let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;
因为
ascii(msgStr[i]) - ascii(keyStr[i])
可以为负数。
%
运算符在 javascript 中并不是真正的模数运算符,它是余数运算符,它 works a little differently.
从上面的 link 来看,您应该可以做更多类似的事情来让它工作:
let x = ((ascii(msgStr[i]) - ascii(keyStr[i])) % 26) + 26) % 26
我正在使用 JavaScript 编写自己的 Vigenere Cipher。我很喜欢。无论如何,加密和解密是相同的,除了 decrypt() 是 '-' keyStr 而不是底部的 '+'。加密工作完美。但是,由于某种原因,在解密时,一些字符随机出现为未定义。我知道该算法适用于 C++、Python、Java 和 Swift。这里有什么错误?
我尝试打印字母表数组中的字符索引,但 decrypt() 中的索引值出现奇怪的结果,我不明白为什么。
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;
}
您遇到的问题是由以下行引起的:
let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;
因为
ascii(msgStr[i]) - ascii(keyStr[i])
可以为负数。
%
运算符在 javascript 中并不是真正的模数运算符,它是余数运算符,它 works a little differently.
从上面的 link 来看,您应该可以做更多类似的事情来让它工作:
let x = ((ascii(msgStr[i]) - ascii(keyStr[i])) % 26) + 26) % 26