我正在寻找一个使用vigenere密码对字符串进行加密的程序。到目前为止,除特殊字符(例如空格,句号,逗号等)外,我已经成功地做到了这一点。
我来到了这个解决方案,其中包括正确的特殊字符。但是,字符串中第一个特殊字符之后的所有内容都会变得乱七八糟。它们不是特殊字符,尽管与密码不匹配,但它们仍在字母中。我无法弄清为什么会这样。我尝试了几种完全不同的方法,所有这些方法均导致相同的错误。到目前为止,这是我想出的最巧妙的方法,但是仍然行不通(在此示例中,您可以假定文本和键的长度相同)。
for (i=0, l=[], k=[], output=""; i < text.length; i++) {
l[i] = (text.charCodeAt(i)) - 97;
k[i] = (key.charCodeAt(i)) - 97;
if ((l[i] > -1) && (l[i] < 26)) { // if the ASCII code is between 0 and 25
ans = parseInt(encryptLetter(l[i], k[i]));
output += String.fromCharCode(97 + ans);
};
if ((l[i] < 0) || (l[i] > 25)) { // if the ASCII code is not between 0 and 25
output += String.fromCharCode(97 + l[i])
};
};
function encryptLetter(l, k) {
en = l + k;
if (en > 25) { // if encrypted letter is greater than 26.
en -= 26;
}
return en;
}
如果需要,可以测试加密here。任何帮助将不胜感激。
编辑: 我注意到,每隔四个特殊字符,都会有一个与密码正确的常规字符块。我不知道为什么。这完全让我感到困惑。
答案 0 :(得分:0)
对于任何想知道的人,我都将其修复。我注意到,在每个特殊字符之后,它们的键将后退一个字母。例如,如果键为apples
,则在第一个特殊字符之后,键将变为pplesa
。在第二个特殊字符之后,键将变为plesap
。为了解决这个问题,我只是在if语句的末尾添加了p -= 1;
以用于特殊字符。这解决了问题。谢谢所有帮助的人。
亲切的问候,
答案 1 :(得分:-1)
您可以使用ASCII值检查字符类型。由于您指定了任何非小写字母,因此如果ASCII值不在97-122范围内,则可以将字符标记为特殊字符。
您可以将原始字符串中的特殊字符存储在某种哈希图中。您可以将字符设置为键,将值设置为链接列表。链接列表可以存储字符的索引,因此您知道它们在原始字符串中的位置。