请问您能看一下这段代码吗?
#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数组上的文字或密码字母高于“不确定”时,我就会收到错误的解密文字。
答案 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;