C编程 - 尝试制作Vigenere加密/解密程序[关闭]

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

你能看一下这段代码吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char encrypt(char *abc, int *key,char text, int counter)
{
   int i;
   int encryptedletter;


   for(i=0;i<=25;i++)
   {
     if(text==abc[i])
     {
     encryptedletter = (i + key[counter])%26 ;
     return abc[encryptedletter];
     }
   }

}


char decrypt(char *abc, int *key,char text, int counter)
{
  int i;
  int decryptedletter;


  for(i=0;i<=25;i++)
  {
    if(text==abc[i])
    {
      decryptedletter = (i-key[counter])%26 ;
      return abc[decryptedletter];
    }
  }

}





int main(void)
{
  char text[100];
  char encryped[100];
  char decrypted[100];
  char key[20];
  int i,z,q,keylength,counter=0;
  char abc[27]= "abcdefghijklmnopqrstuvwxyz"; //ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789        .";
  int keyint[70];

  printf("Give Text: ");
  gets(text);

  printf("Give Password: ");
  gets(key);

  keylength = strlen(key);

  for(z=0;z<strlen(key);z++)
  {
     for(i=0;i<=25;i++)
     {
        if(key[z]==abc[i]) keyint[z] = i;
     }
  }


//~~~~~~~~~~~~~~~~~~~~~~~~~~ENCRYPTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  for(i=0;i<strlen(text);i++)
  {
     if(counter>=keylength) counter=0;
     encryped[i] = encrypt(abc,keyint,text[i],counter);
     counter++;

  }
  encryped[strlen(text)]='\0';
  printf("\nEncrypted text: %s\n", encryped);

//~~~~~~~~~~~~~~~~~~~~~~~~~~DECRYPTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
counter =0;

for(q=0;q<=strlen(text);q++)
{
    if(counter>=keylength) counter=0;
    decrypted[q] = decrypt(abc,keyint,encryped[q],counter);
    counter++;
    printf("%c", decrypted[q]);
}


  return 0;
}

我正在尝试基于Vigenere制作加密/解密程序。

我认为它工作正常..但是当我的abc数组上的文字或密码字母高于'T'(不确定)时,我得到了错误的解密文本。

c encryption cryptography vigenere
1个回答
0
投票

当你从未在if(text==abc[i])encrypt()中输入decrypt()时,你需要考虑这个案例。在这种情况下你写入encrypted / decrypted的回报值是多少?

您可能希望return text未加密,以便保留空格,标点符号等,从而确保加密和解密的消息长度为strlen(text)

最后,decryptedletter = ((i-key[*counter])%26)可以变为负面,这样你就不能用它作为abc[decryptedletter]的索引。在这种情况下,你需要“包裹它”,例如通过

if(decryptedletter<0) decryptedletter += 26;
© www.soinside.com 2019 - 2024. All rights reserved.