1

我正在为 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]); 
      }  

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

4

2 回答 2

2

当您到达键的末尾时,返回索引 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]); 
  }  
于 2012-12-02T04:42:22.703 回答
0

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

于 2013-05-09T08:57:46.843 回答