【问题标题】:How to loop my key in Vigenere Cipher如何在 Vigenere Cipher 中循环我的密钥
【发布时间】:2012-12-02 04:37:59
【问题描述】:

我正在为 Vigenere Cipher 编写一个程序。但我不知道如何让我的密钥重复直到我的纯文本结束。现在我的代码所做的只是加密与我的密钥的字母数量相等的字母。例如,我输入“dog”的密钥,而我的纯文本是“catdog”,它给了我一个“fozdyw”的加密文本。这意味着它只加密前 3 个字母。

这是我的一些加密代码:

for (int j=0, k=0; j < strlen(text); j++, k++)
      {         
        if((text[j] >= 'A') && (text[j] <= 'Z'))
            text[j] = ((text[j] -'A') + key[k]) % 26 +'A';

        if((text[j] >= 'a') && (text[j] <= 'z'))
            text[j] = ((text[j] -'a') + key[k]) % 26 +'a';

        printf("%c", text[j]); 
      }  

我做错了什么?正确的做法应该是什么?

【问题讨论】:

  • 嗯......你似乎知道模数运算符。也考虑使用它...

标签: c vigenere


【解决方案1】:

当您到达键的末尾时,返回索引 0,这是通过使用除以键的大小(AKA 模数)的余数来完成的:

  for (int j=0, k=0; j < strlen(text); j++, k++)
  {         
    if((text[j] >= 'A') && (text[j] <= 'Z'))
        text[j] = ((text[j] -'A') + key[k % size_of_the_key]) % 26 +'A';

    if((text[j] >= 'a') && (text[j] <= 'z'))
        text[j] = ((text[j] -'a') + key[k % size_of_the_key]) % 26 +'a';

    printf("%c", text[j]); 
  }  

【讨论】:

  • 感谢 Binyamin Sharet。它确实奏效了。如果您不介意,再问一个问题。我希望我的代码忽略空格和符号。有什么建议我该怎么做?谢谢。
  • 这取决于你想用它们做什么。如果您想从加密的有效负载中删除它们,您可以添加一个索引到您在“文本”中分配的位置,并且在达到此类字符时不要增加它。但是无论如何你都需要处理键的索引,当你到达这样的字母时不要增加它。
【解决方案2】:

ascii 表是一个很好的参考。也就是说,防止符号被加密。准确地说,努力使用特定范围的字母。例如在 65 到 90 之间表示大写,否则终止该程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多