荆轲 发表于 2022-4-15 10:47:11

数据结构和算法-线性表17-维吉尼亚加密

//维吉尼亚加密
//明文+随机生成秘钥,将对应的字符按秘钥右移=密文,秘钥要同密文一同保存

#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

荆轲 发表于 2022-4-15 10:50:37

将“//      srand((unsigned)time(NULL));//随机生成数”   这一句中前面的// 去掉,这样每次生成的随机秘钥不相同

荆轲 发表于 2022-4-15 10:59:50

void decrypt(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<65)
                        {
                                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<97)
                        {
                                L->next->data=temp+26;//'a'+(temp-'z')-1
                        }
                        else
                        {
                                L->next->data=temp;//
                        }
                }

                printf("%c",L->next->data);
                L=L->next;
        }
        printf("\n");
}
页: [1]
查看完整版本: 数据结构和算法-线性表17-维吉尼亚加密