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

问题描述 投票:1回答:2

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

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

c vigenere
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]); 
  }  

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.