維吉尼亞密碼


原理

維吉尼亞密碼是一種簡單的多表代換密碼(由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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM