求个程序
在密码学中,密文可以看作是使用加密密钥的明文(纯消息)的加密结果。 Vigenere 密码的工作原理如下:1.选择一个字符串(明文消息)作为输入,例如,我们选择" tellhimaboutme ”作为明文。
2.选择一个简短的秘密单词(另一个字符串)作为关键字,例如,在本例中,我们选择" cafe ”作为关键字。3.如果所选的关键字短于明文,则重复此操作,直到长度匹配为止。例如,在步骤1和步骤2中分别使用输入和密钥,重复的密钥应该是" c…a"。4.然后,根据步骤3中输出的密钥中相应字符的字母表号对明文的每个字符进行移位。(例如,字母" a "是1," e "是5,等等),因此,加密执行如下表所示。例如,明文中第一个字符“ t ”的字母表号是20,键"℃"中对应字符的字母表号是3。因为23(20+3)表示字符" w ”," t ”将被加密为" w "。
明文: telhimaboutme
密码: c…a
密文: wfrakjsfepaypf
现要求如下:
(1)按题意要求,写一个程序把输入的明文转换成密文。我们假设输入是正确的,它是一个 char 类型的字符串,字符串的长度<=100。此外,输入不包括空白字符,您的解决方案中使用的键是“ sylu ”。输入输出格式同上。
(2)再写一个程序把输入的密文转换成明文。我们假设输入是正确的,它是一个 char 类型的字符串,字符串的长度<=100。此外,输入不包括空白字符,您的解决方案中使用的键是" sylu ”。我们假设输入密文的长度比" sylu "键的长度长。这意味着键可以重复,直到长度匹配
输入格式:密文: pdnzehqqxhztht
输出格式◇明文: webelieveinyou
提前谢过
我用的是C++
1是加密,2是解密。
#include <cstdio>
#include <cstring>
using namespace std;
char Rstring[10000];
char Key[10000];
char Estring[10000];
int mode;
int main()
{
while(1)
{
printf("Use 1 to encode it and Use 2 to unencode it\n");
scanf("%d", &mode);
if(mode == 2)
{
scanf("%s", Rstring);
scanf("%s", Key);
int slen = strlen(Rstring);
int klen = strlen(Key);
for(int i=0;i<slen;++i)
{
Estring[i] = Rstring[i] - Key[i%klen] + 'a' - 1;
while(Estring[i] < 'a') Estring[i] += 26;
while(Estring[i] > 'z') Estring[i] -= 26;
printf("%c",Estring[i]);
}
}
else if(mode == 1)
{
scanf("%s", Rstring);
scanf("%s", Key);
int slen = strlen(Rstring);
int klen = strlen(Key);
for(int i=0;i<slen;++i)
{
Estring[i] = Rstring[i] + Key[i%klen] - 'a' + 1;
while(Estring[i] < 'a') Estring[i] += 26;
while(Estring[i] > 'z') Estring[i] -= 26;
printf("%c",Estring[i]);
}
}
printf("\n");
}
}
请问可以吗
#include<stdio.h>
#include<string.h>
char equcode[100];
void tocode(char t[],char code[],char coded[])
{
gets(t);
gets(code);
int len1=strlen(t),len2=strlen(code);
int p=len2;
strcpy(equcode,code);
int i=0,j;
while(p<len1)
{
equcode[p++]=code[i++];
if(i==len2) i-=i;
}
equcode[p]='\0';
for(i=0; i<len1; i++)
{
coded[i]=(equcode[i]+t[i]-'a'+1);
if(coded[i]>'z')
coded[i]-=26;
}
coded[i]='\0';
puts(equcode);
}
void uncode(char t[],char code[],char coded[])
{
int i;
int len1=strlen(t),len2=strlen(code);
for(i=0; i<len1; i++)
{
t[i]=(coded[i]-equcode[i]+'a'-1);
// printf("%d ",t[i]);
if(t[i]>'z')
t[i]-=26;
}
t[i]='\0';
}
int main()
{
char t[100],code[100],coded[100];
tocode(t,code,coded);
printf("\n");
puts(coded);
printf("\n");
gets(coded);
uncode(t,code,coded);
puts(t);
// printf("%c",'t'+'c'-'a');
// printf("\n%d %d %d",'t','c','a');
return 0;
}