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

Posted

技术标签:

【中文标题】C 编程 - 尝试制作 Vigenere 加密/解密程序 [关闭]【英文标题】:C programming - Trying to make Vigenere encryption/decryption program [closed] 【发布时间】:2014-05-22 23:38:05 【问题描述】:

你能看一下这段代码吗?

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

【问题讨论】:

您可以在 codereview.stackexchange.com 上获得帮助 【参考方案1】:

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

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

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

if(decryptedletter<0) decryptedletter += 26;

【讨论】:

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

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

我的 Vigenere 加密程序中的分段错误

尝试加密和解密 vigenere 密码

Python Vigenere 元组错误

C 中的 Vigenere Square 解密

Vigenere 加密