|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//维吉尼亚加密
//明文+随机生成秘钥,将对应的字符按秘钥右移=密文,秘钥要同密文一同保存
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef char Status;
typedef struct DualNode
{
ElemType data;
ElemType key;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinklist;
Status InitList(DuLinklist *L)//初始化
{
DualNode *p_temp,*q;
char ch_temp;
int i,num=0;
// srand((unsigned)time(NULL));//随机生成数
*L=(DualNode*)malloc(sizeof(DualNode));
if(!(*L))//判断链表是否创建失败
{
return ERROR;
}
(*L)->next=(*L)->prior=NULL;//头结点,为空
p_temp=(*L);
printf("请输入需要加密的明文,按#键结束:\n");
scanf("%c",&ch_temp);
while(ch_temp!='#')
{
q=(DualNode*)malloc(sizeof(DualNode));
if(!q)
{
return ERROR;
}
if(ch_temp<'A'||ch_temp>'z'||(ch_temp>'Z'&&ch_temp<'a'))
{
q->data=ch_temp;
q->key=' ';//空格时,不作处理,秘钥为空格
}
else
{
q->data=ch_temp;
q->key=rand()%50;//随机产出秘钥key
}
q->prior=p_temp;
q->next=p_temp->next;
p_temp->next=q;
p_temp=q;
num=num+1;//计算链表结点数
scanf("%c",&ch_temp);
}
getchar();
p_temp->next=(*L)->next;
(*L)->next->prior=p_temp;
printf("原文为:");//打印原文
for(i=0;i<num;i++)
{
printf("%c",(*L)->next->data);
(*L)=(*L)->next;
}
printf("\n秘钥为:");//打印秘钥
for(i=0;i<num;i++)
{
if((*L)->next->key!=' ')//非字母的秘钥不显示
{
printf("%-3d",(*L)->next->key);//秘钥以数字显示
}
(*L)=(*L)->next;
}
printf("\n");
return num;
}
#if(1)
void keyword(DuLinklist L,int num)//生成并打印密文
{
int i,temp;
printf("密文为:");
for(i=0;i<num;i++)
{
temp=L->next->data+L->next->key%26;
if(L->next->data>='A'&&L->next->data<='Z')
{
if(temp>90)
{
L->next->data=temp-26;//'A'+(temp-'Z')-1
}
else
{
L->next->data=temp;//
}
}
if(L->next->data>='a'&&L->next->data<='z')
{
if(temp>122)
{
L->next->data=temp-26;//'a'+(temp-'z')-1
}
else
{
L->next->data=temp;//
}
}
printf("%c",L->next->data);
L=L->next;
}
printf("\n");
}
int main()
{
DuLinklist L;
int num,temp;
num=InitList(&L);
keyword(L,num);
return 0;
}
#endif |
|