维吉尼亚加密算法 (C语言实现简单的加密算法) ------- 算法笔记007

限于喜欢 提交于 2020-01-29 16:16:07

概念理解

什么是维吉尼亚加密算法

加密步骤:1.创建一个匹配循环链表;2.接受需要加密的明文;3.根据随机生成的密钥配合链表进行移位;4.输出/保存对应的密文

解密步骤: 1.接受加密后的密钥;2.根据密文找到对应的匹配值,通过密钥进行逆移位操作找到明文输出

总的来说维吉尼亚加密算法就是对循环链表的查找操作
这里我们来模拟a-z实现加密操作

在这里插入图片描述

我们输入changlon,然后生成随机密钥,进行加密操作
如:字符c,随机生成的密钥为2
我们找到a-z循环链表中的c字符位置,向后查找2个单位指到e的位置,e就是对应c的密文
注:图中的A-Z大写链表理解为a-z的小写链表,整个链表是循环的

实现代码

匹配链表结构定义

//双向循环链表结构
typedef struct doulNode{
	char data;
	struct doulNode *next;//指向下一个节点
	struct doulNode *prior;	//指向上一个节点	
}Doul,*DoulList;

创建一个匹配链表

//Status ,ok,error是宏定义int ,1,0
Status createLink (DoulList *L){

	(*L)=(DoulList)malloc(sizeof(Doul));
	(*L)->next=(*L)->prior=NULL;//链表的头初始化
	DoulList p,q;
	p=(*L);
	int i;
	for(i=0;i<ALPHAS;i++){
		q=(DoulList)malloc(sizeof(Doul));
		q->data='a'+i;
		q->next=p->next;
		q->prior=p;
		p->next=q;
		p=q;
	}
	p->next=(*L)->next;
	(*L)->next->prior=p;
	p=(*L);
	(*L)=p->next;
	free(p);//释放头节点
	
	if((*L)->data=='a'){
		return ok;	
	}
	
	return error;
}

加密的实现代码

Status encryption(DoulList L){
    	int index=0;
    	int i;
    	for(i=0;i<SIZE;i++) //清理缓存 
    		data[i]=0;
    		
		printf("输入明文:");
		scanf("%s",data);
		printf("\n");	
		srand(time(NULL));//设置一个随机种子
		while(data[index]){
			int secretKey=rand()%100+1;//生成随机密钥
			int j; 
			secret[index]=secretKey; 
			//找到对应相同的的字符
			 while(L->data!=data[index]){
			 	L=L->next;
			 }
			 //进行移位
			 for(j=0;j<secretKey;j++){
			 	L=L->next;
			 }
			 
			data[index]=L->data;	
			printf("%c",data[index]);
			index++;
		}
		return ok;
}

工程代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ok 1
#define error 0
#define ALPHAS 26 
#define SIZE 100
typedef int Status;
typedef struct doulNode{
	char data;
	struct doulNode *next;
	struct doulNode *prior;		
}Doul,*DoulList;


int secret[SIZE]={0};
char data[SIZE]={0};

Status createLink (DoulList *L);
Status encryption(DoulList L);
void checkSecretKey(void);

int main(int argc, char *argv[]) {

	DoulList L=NULL;
    int status=createLink (&L);
    if(status){
    	printf("-----------------------维吉尼亚加密算法---------------------------\n");
    	printf("\n");
    	printf("作者: changlon\n时间: 2019-12/17\n");
    	printf("\n");
		printf("------------------------------------------------------------------\n");
    	
    	encryption(L);	
    	checkSecretKey();
	}else{
		printf("内存异常");
	}
	
	printf("\n");
	system("pause");
	return 0;
}

void checkSecretKey(void){
		int index=0;
		printf("\n\n"); 
    	printf("你生成的密钥:");
		while(secret[index]){
			printf("%d ",secret[index++]);
		}	
}

Status encryption(DoulList L){
    	int index=0;
    	int i;
    	for(i=0;i<SIZE;i++) //清理缓存 
    		data[i]=0;
    		
		printf("输入明文:");
		scanf("%s",data);
		printf("\n");	
		srand(time(NULL));
		while(data[index]){
			int secretKey=rand()%100+1;
			int j; 
			secret[index]=secretKey; 
			 while(L->data!=data[index]){
			 	L=L->next;
			 }
			 for(j=0;j<secretKey;j++){
			 	L=L->next;
			 }
			 
			data[index]=L->data;	
			printf("%c",data[index]);
			index++;
		}
		return ok;
}

Status createLink (DoulList *L){

	(*L)=(DoulList)malloc(sizeof(Doul));
	(*L)->next=(*L)->prior=NULL;
	DoulList p,q;
	p=(*L);
	int i;
	for(i=0;i<ALPHAS;i++){
		q=(DoulList)malloc(sizeof(Doul));
		q->data='a'+i;
		q->next=p->next;
		q->prior=p;
		p->next=q;
		p=q;
	}
	p->next=(*L)->next;
	(*L)->next->prior=p;
	p=(*L);
	(*L)=p->next;
	free(p);
	if((*L)->data=='a'){
		return ok;	
	}
	
	return error;
}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!