如何在Vigenere Cipher中循环我的密钥

时间:2012-12-02 04:38:00

标签: c vigenere

我正在为Vigenere Cipher编写一个程序。但我不知道如何使我的密钥重复直到我的纯文本结束。现在我的代码所做的只是加密相当于我的密钥所具有的字母数的字母。例如,我输入一个“狗”键,我的纯文本是“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]); 
      }  

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

2 个答案:

答案 0 :(得分: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]); 
  }  

答案 1 :(得分:0)

ascii表是一个很好的参考。也就是说,防止符号被加密。准确地说,还要努力使用各种各样的字母。例如介于65和90之间的大写else会终止该程序。