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加密/解密程序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章