C编程 - 尝试制作Vigenere加密/解密程序

时间:2014-05-22 23:38:06

标签: c encryption cryptography vigenere

请问您能看一下这段代码吗?

#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数组上的文字或密码字母高于“不确定”时,我就会收到错误的解密文字。

1 个答案:

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