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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C编程 - 尝试制作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)]='';
  printf("
Encrypted text: %s
", 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'(不确定)时,我得到了错误的解密文本。

答案

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

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

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

if(decryptedletter<0) decryptedletter += 26;

以上是关于C编程 - 尝试制作Vigenere加密/解密程序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

尝试加密/解密时出现 vigenere 密码错误

尝试加密和解密 vigenere 密码

C 中的 Vigenere Square 解密

Python 中的 Vigenere 密码

Vigenere 加密

Vigenere Cipher使用命令行提示