维吉尼亚密码

维吉尼亚密码原理维吉尼亚密码是一种简单的多表代换密码(由26个类似的Caesar密码的代换表组成),即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。英文中a~z,由0~25表示。假设串长为m,明文为P,密文为C,密钥为K则也可以根据图1进行计算,如图。例如,假如明文为:ATTACKAT

大家好,欢迎来到IT知识分享网。

原理

维吉尼亚密码是一种简单的多表代换密码(由26个类似的Caesar密码的代换表组成),

即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。

英文中a~z,由0~25表示。

假设串长为m,明文为P,密文为C,密钥为K则

[公式]

[公式]

也可以根据图1进行计算,如图。

维吉尼亚密码

例如,假如明文为:
ATTACKATDAWN
选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:
LEMONLEMONLE
对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:
明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:LXFOPVEFRNHR

实现

#include<stdio.h>

//加密
int encrypt(char *text,char *result,char *k)
{
    int l,i,j=0,z=0;
    for(l=0;text[l]!='\0';l++);
    for(i=0;i<l;i++)
    {
        result[z]=(text[i]-'a'+k[j]-'a')%26+'a';
        j++;
        z++;
    }
    return 0;
}

//解密
int decrypt(char *text,char *result,char *k)
{
    int l,i,j=0,z=0;
    for(l=0;text[l]!='\0';l++);
    for(i=0;i<l;i++)
    {
        result[z]=(text[i]-k[j]+26)%26+'a';
        j++;
        z++;
    }
    return 0;
}

int main()
{
    char text[50]="";
    char result[50]="";
    char k[50]="";
    int type;
    /**欢迎**/
    printf("--------欢迎使用Vigenere密码-----------\n");
    printf("请填写明文或者密文\n");
    scanf("%[^\n]",text);
    printf("请选择加密方式,输入1加密,输入2解密\n");
    scanf("%d",&type);
    printf("请输入密钥k\n");
    scanf("%s",k);
    if(type == 1){
        /**加密**/
        encrypt(text,result,k);
        printf("明文%s的密文为:%s\n",text,result);
    }else if(type == 2){
        /**解密**/
        decrypt(text,result,k);
        printf("密文%s的明文为:%s\n",text,result);
    }
    return 0;
}

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31178.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信