概念理解
什么是维吉尼亚加密算法
加密步骤: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;
}
来源:CSDN
作者:Changlon
链接:https://blog.csdn.net/qq_35392733/article/details/104105952