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

维吉尼亚密码(Vigenère cipher),第1张

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

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

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

#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=0message[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()。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12430060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存