为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
char data;
Node* prior;
Node* next;
}*SLink;
void init(SLink* l)
{
SLink t, q;
*l = (SLink)malloc(sizeof(Node));
q = *l;
q->data = 'A';
for (int i = 1; i < 26; i++)
{
t = (SLink)malloc(sizeof(Node));
t->data = 'A' + i;
q->next = t;
t->prior = q;
q = t;
}
q->next = *l;
(*l)->prior = q;
}
char encryption(char y,char m, SLink t)
{
while (t->data != m)
{
t = t->next;
}
int i = (int)y - 65;
while (i--)
{
t = t->next;
}
return t->data;
}
char decrypt(char y, char m, SLink t)
{
char ts;
while (t->data != m)
{
t = t->next;
}
ts = 'A';
while (t->data != y)
{
t = t->next;
ts++;
}
return ts;
}
int main()
{
SLink l;
int n = 0;
char pri[100];
char key[100];
init(&l);
while (true)
{
printf("选择解密还是加密(1为加密,其他为解密):");
scanf("%d",&n);
if (n == 1)
{
printf("请输入明文:");
scanf("%s", &pri);
printf("请输入秘钥:");
scanf("%s", &key);
printf("密文为:");
for (int i = 0; pri[i]; i++)
{
printf("%c", encryption(pri[i],key[i],l));
}
printf("\n");
}
else
{
printf("请输入密文:");
scanf("%s", &pri);
printf("请输入秘钥:");
scanf("%s", &key);
printf("明文为:");
for (int i = 0; pri[i]; i++)
{
printf("%c", decrypt(pri[i], key[i], l));
}
printf("\n");
}
}
return 0;
}