密码学Vignere的算法实现
1、一、古典密码 Vignere概述
1858年法国密码学家维吉尼亚提出一种以移位替换为基础的周期替换密码。这种密码是多表替换密码的一种。是一系列(两个以上)替换表依次对明文消息的字母进行替换的加密方法。
2、二、算法原理与设计思路
1.首先使用维吉尼亚方阵,它的基本方阵是26列26行。方阵的第一行是a到z按正常顺序排列的字母表,第二行是第一行左移循环一位得到得,其他各行依次类推。
2.加密时,按照密钥字的指示,决定采用哪一个单表。例如密钥字是bupt,加密时,明文的第一个字母用与附加列上字母b相对应的密码表进行加密,明文的第二个字母用与附加列的字母u相对应的密码表进行加密,依次类推。
3.令英文字母a,b,…,z对应于从0到25的整数。设明文是n个字母组成的字符串,即 m=m1m2m3m4…mn
密钥字周期性地延伸就给出了明文加密所需的工作密钥
K=k1k2…kn,E(m)=C=c1c2…cn
加密:Ci=mi+kimod26
解密:mi=ci-kimod26,i=1,2,3,…,n
3、三、关键算法分析
*********************************************************************
#include<Stdio.h>
#include<Conio.h>
#include<string.h>
#include<malloc.h>
#defineMAX 100
staticint square[27][27];
char* vigenere(char key[],char word[]);
char* anti_vigenere(char key[],char * en_word);
intmain(void)
{
char key[MAX],word[MAX], *en_word;
int i,j,k,m;
for(i=1;i<27;i++){
for(j=1;j<27;j++){
square[i][j]=63+i+j;
if(square[i][j]>90)
square[i][j]=square[i][j]-26;
}
}
for(k=1;k<27;k++){
for(m=1;m<27;m++){
printf("%c ",square[k][m]);
}
printf("\n");
}
printf("VigenereCipher \nPlease input plain text:");
scanf("%s",word);
printf("inputthe key:");
scanf("%s",key);
en_word=vigenere(key,word);
printf("\nTheresult is: %s\n",en_word);
printf("\n\tDecryption:\n");
printf("Theplain text is:%s\n",anti_vigenere(key,en_word));
getch();
return0;
}
/*加密算法*/
char* vigenere(char key[],char word[]){
char *text=(char*)malloc(MAX*sizeof(char));
intkey_length=strlen(key);
int word_length=strlen(word);
int i,j,c;
for(i=0;i<word_length;i++){
if((word[i]>=65&&word[i]<=90)||(word[i]>=97&&word[i]<=122)){
if(word[i]>=97&&word[i]<=122){
c=word[i]-96;
}
else {
c=word[i]-64;
}
j=i%key_length;
text[i]=square[key[j]-96][c];
}
else text[i]=word[i];
}
text[i]='\0';
return text;
}
/*解密算法*/
char* anti_vigenere(char key[],char * en_word){
char *word=(char *)malloc(MAX*sizeof(char));
int key_length=strlen(key);
int word_length=strlen(en_word);
int i,j,c,k,d;
for(i=0;i<word_length;i++){
if(en_word[i]>=65&&en_word[i]<=90){
c=i%key_length;/*所用密钥在所在*/
k=key[c]-96;
d=en_word[i]-square[k][1];
if(d>=0){
word[i]='a'+d;
}else{
word[i]='z'+d+1;
}
}else{
word[i]=en_word[i];
}
}
word[i]='\0';
return word;
}
********************************************************************************
这是运行结果!
