-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”(不确定)时,我会得到错误的解密文本。

4

1 回答 1

0

您需要考虑从不进入if(text==abc[i])andencrypt()的情况decrypt()。在这种情况下,您写入encrypted/的返回值是decrypted多少?

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

最后,decryptedletter = ((i-key[*counter])%26)可以变为负数,因此您不能将其用作abc[decryptedletter]. 在这种情况下,您需要“将其包裹起来”,例如通过

if(decryptedletter<0) decryptedletter += 26;
于 2014-05-23T00:15:36.477 回答