维吉尼亚密码加密代码(维吉尼亚密码加密算法)

2023-02-11 20:47:43 摩斯密码知识 思思

维吉尼亚密码(Vigenère cipher)

维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RE LA TI ONS RE LA TION SR ELA TIONSREL

明文:TO BE OR NOT TO BE THAT IS THE QUESTION

密文:KS ME HZ BBL KS ME MPOG AJ XSE JCSFLZSY

与凯撒密码类似,进行一下运算两次即可

维吉尼亚密码c语言求改。

#include stdlib.h

#include stdio.h

#include string.h

#define N 10000

void function(char message[],char key[],int mode); //加解密函数

int main()

{

int choose;

char m[N],key[N];

printf("维吉尼亚加密,请输入1;解密,请输入2:\n");

scanf("%d",choose);

getchar();

if (choose == 1 || choose == 2)

{

if (choose == 1)

printf("输入明文:\n");

if (choose == 2)

printf("输入密文:\n");

gets(m);

printf("输入密钥:\n");

gets(key);

function(m,key,choose);

}

else

printf("输入错误!\n");

return 0;

}

void function(char message[],char key[],int mode) //加解密函数

{

int i, j = 0; //j控制key的轮回

int len_k = strlen(key); //密钥长度

char s[N];

for(i=0; message[i]!='\0'; i++)

{

if(message[i] == 32) //判断空格

s[i]=' ';

else

{

if (mode == 1)

s[i]=(int(message[i]-'a')+int(key[j%len_k]-'a'))%26+97;

if (mode == 2)

s[i]=(int(message[i]-'a')-int(key[j%len_k]-'a')+26)%26+97;

j++;

}

printf("%c",s[i]);

}

printf("\n");

}

gets(l);//不加这句M就输入不了为什么?

是因为没有这句的话,按的回车键就输成m了。

连用两个输入语句时,需要考虑回车键,就像我代码里的getchar()。

维吉尼亚密码

      维吉尼亚密码是以法国外交官、密码学家布莱斯·德·维吉尼亚的名字命名的,不过不是他本人发明的。

【加密原理】

      维吉尼亚密码是在凯撒密码的基础上产生的一种加密方法,它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行26列的密码表。

      除了密码表,还必须有一个密钥。密钥由字母组成,最少一个字母,最多可与明文字母数相等。如果密钥只有1个字母,相当于就是凯撒密码。举个例子:

明文:I Love You

密钥:OK

      首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到长度相等。本例中,明文长度为8个字母(非字母忽略),密钥补全为“OKOKOKOK”。

      然后根据密码表进行加密。明文第一个字母是“I”,密钥第一个字母是“O”,在表格中找到“I”列与“O”行的相交点,字母“W”就是密文的第一个字母。同理,“L”列与“K”行交点字母是“V”。“O”列与“O”行交点字母是“C”……以此类推,得到密文: W VCFS ICE。

【解密原理】

密文:PWZRNZBZ EA NQKBUHN LNB

密钥:wind

      首先把密钥重复拼接到和密文长度相同,上例中密文为20位字母,密钥拼接后为:windwindwindwindwind。

      密文P对应密钥W,在密码表中找出W行为P的列,沿着这一列向上找到最上面的字母是T。以此类推,得到明文:tomorrow is another day。

维吉尼亚密码加密代码(维吉尼亚密码加密算法) 第1张