使用 vigenere 密码加密时出现奇怪的错误

Posted

技术标签:

【中文标题】使用 vigenere 密码加密时出现奇怪的错误【英文标题】:Strange error when encrypting using a vigenere cipher 【发布时间】:2018-08-20 02:04:35 【问题描述】:

我正在寻找使用 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。任何帮助将不胜感激。

编辑: 我注意到每四个特殊字符,就有一个对密码正确的常规字符块。我不知道为什么。这完全让我感到困惑。

【问题讨论】:

你能举个例子吗? 我想知道编写你的密码是否更容易,以便它只将特殊字符映射到自己。 我看不到任何方法可以记住加密/编码后特殊字符应该在哪里,而不是完整地存储原始字符串。也许这会破坏您在这里尝试做的事情的目的。 只是if (isSpecial) result[i] = input[i] else result[i] = encode(input[i])? @Bergi 我试了一下,它显着减少了我的代码长度,所以谢谢。不幸的是,它并没有解决我的问题;我仍然得到完全相同的错误。我更新了上面的问题以合并此方法。如果你能看一下那就太好了。 【参考方案1】:

对于任何想知道的人,我修复了它。我注意到在每个特殊字符之后,他们的键会向后移动一个字母。例如,如果键是apples,那么在第一个特殊字符之后,键将变为pplesa。在第二个特殊字符之后,密钥将变为plesap。为了解决这个问题,我刚刚在 if 语句的末尾添加了 p -= 1; 以获取特殊字符。这解决了问题。感谢所有提供帮助的人。

亲切的问候,

【讨论】:

【参考方案2】:

您可以使用 ASCII 值检查字符类型。由于您指定了任何非小写字母,因此如果字符的 ASCII 值不在 97-122 范围内,则可以将其标记为特殊字符。

您可以将原始字符串中的特殊字符存储在某种哈希图中。您可以将字符设为键,将值设为链表。链表可以存储字符的索引,因此您可以知道它们在原始字符串中的位置。

【讨论】:

我将如何制作哈希图,更具体地说,我将如何重新输入丢失的字符?我已经将它们转换为 ASCII。 为什么要按字符存储索引?这没有任何意义。 @Bergi 因为对于每个键(OP 在其原始字符串中检测到的特殊字符),您知道该字符在原始字符串中出现的索引,对于该字符串中该字符的所有实例。 @Intelta 您可以在 javascript 中使用字典。您可以遍历字典中的键并将任何您想要的新字符重新插入到原始字符串中每个特殊字符出现的索引中。

以上是关于使用 vigenere 密码加密时出现奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 Vigenere 密码错误

反映加密的 Access 数据库时出现“无效密码”错误

我的 vigenere 密码加密功能有啥问题?

尝试加密和解密 vigenere 密码

为啥 Vigenere 密码只能正确加密部分消息?

加密 Vigenere 密码