0

Vigenere 对消息的加密不正确,例如,如果密钥是“hello”而消息是 hello,则加密文本现在是“eipsv”,而应该是“hello”。

我真的很感激有关修复此错误的任何提示。

    string message = GetString();
    int m = strlen(message);
    int i = 0;

      if(isalpha(message[i]))
      {
     for(int j = 0; j < n; i++)
    {
     key[j] = tolower(key[j]) - 97;
     j++;

      for (i = 0; i < m; i++)
       {
            char c = message[i];

              if (islower(c))
                {
                    c = (((c - 'a' + key[j%n])%26) +'a');
                    j++;
                    printf("%c", c);
                }
              if (isupper (c))
                    {
                        c = (((c - 'A' + key[j%n])%26) +'A');
                        j++;
                        printf("%c", c);
                        }
              else if (!isupper(c) && !islower(c))
                    {
                     printf("%c", c);
                     j++;
                    }  
      } 
      }
    }
   printf("\n");  
    }
4

2 回答 2

0

使用关键字“hello”会将您的消息“hello”编码如下:

h -> (shift 7) -> o 
e -> (shift 4) -> i 
l -> (shift 11) -> w
l -> (shift 11) -> w 
0 -> (shift 14) -> c 

所以,结果应该是“oiwwc”。

于 2015-07-18T03:55:26.360 回答
0

好的,一些变化:

您将密钥转换为 0 - 25 值的第一个循环应该在与编码循环不同的循环中。转换密钥,然后继续进行编码循环。

在编码循环中,您将需要两个增量器“i”和“j”,它们都需要在 FOR (...;...;...) 行中重新初始化为 0。您不能从密钥转换循环中重用“j”,因为它超出了范围。

从编码循环中的 ELSE IF 语句中删除 printf() 行之后的 j++。如果字母未编码,则不要增加“j”。

顺便说一句,一旦你更新你的程序并通过 check50 运行它,你会发现几个错误检查错误,因为你有一些错误条件需要检查,我在你当前的代码中没有看到。但是,它应该通过上述更改正确编码。

于 2015-07-19T02:34:01.437 回答