Vigenère Cipher 維吉尼亞加解密算法


 

維吉尼亞的加解密有兩種方法。

 

第一種是查表:第一行為明文,第一列為密鑰,剩余的為對應的密文

 


 

 

第二種方法是轉化計算法:逐個將字符轉化為從零開始的數字,對數字進行加密/解密后,再轉化為字符。

本文要用c++實現第二種方法,並且為了操作方便,使用了MFC框架(附工程下載)

核心代碼如下:

//cipher.h  額外添加的文件,用來放置相關算法,此文件獨立於MFC外,可直接移植到支持CString的項目中
int* CStringToInt(CString str){
    //將CString轉換為zero_based整數
    int size=str.GetLength();
    int *asc_space=new int[size];//使用new為了返回時不被消除
    for (int i=0;i<size;i++)
    {
        asc_space[i]=int(str.GetAt(i));
        if(asc_space[i]>64&&asc_space[i]<91)        //A-Z轉化
            asc_space[i]-=65;
        else if(asc_space[i]>96&&asc_space[i]<123)    //a-z轉化
            asc_space[i]-=97;
    }    
    return asc_space;
}

void Encode(CString key,CString plain,CString &cipher){
    //維吉尼亞加密算法
    int *keycode=CStringToInt(key);
    int *plaincode=CStringToInt(plain);
    int *ciphercode=CStringToInt(plain);
    int keysize=key.GetLength();
    int plainsize=plain.GetLength();
    int flag=0;
    CString blank(' ',plainsize+1);    //預留一個字節放\0
    cipher=blank;                    //生成空白的密文
    for (int i=0;i<plainsize;i++)
    {
        if(flag>=keysize)            //輪換鑰匙
            flag=0;
        ciphercode[i]=(plaincode[i]+keycode[flag])%26;    //求密文的數字碼
        cipher.SetAt(i,'A'+ciphercode[i]);                //生成密文
        ++flag;
    }
    cipher.SetAt(i,'\0');                //在末尾放入\0
    delete keycode,plaincode,ciphercode;//釋放CStringToInt()申請的空間
}

void Decode(CString key,CString &plain,CString cipher){
    //加密稍作修改就是解密算法
    int *keycode=CStringToInt(key);
    int *plaincode=CStringToInt(cipher);
    int *ciphercode=CStringToInt(cipher);
    int keysize=key.GetLength();
    int ciphersize=cipher.GetLength();
    int flag=0;
    CString blank(' ',ciphersize+1);    
    plain=blank;                    
    for (int i=0;i<ciphersize;i++)
    {
        if(flag>=keysize)    
            flag=0;
        //+26是為了對密文數字碼小於密鑰數字碼的情況進行矯正
        plaincode[i]=(ciphercode[i]-keycode[flag]+26)%26;    
        plain.SetAt(i,'a'+plaincode[i]);            
        ++flag;
    }
    plain.SetAt(i,'\0');
    delete keycode,plaincode,ciphercode;
}

 

//MFC OnButton()響應
void
CVigenereCipherDlg::OnEncrypt() //加密按鈕 { UpdateData(); if(m_key.IsEmpty()||m_plain.IsEmpty()) MessageBox("密鑰及明文不能為空!"); else{ Encode(m_key,m_plain,m_cipher);//調用加密函數 UpdateData(false); m_ctrEDIT1.SetReadOnly(TRUE);//防止修改密鑰 m_ctrEDIT2.SetReadOnly(TRUE);//防止修改明文 m_ctrEDIT3.SetReadOnly(TRUE);//防止修改密文 m_ctrEDIT4.SetReadOnly(FALSE); } } void CVigenereCipherDlg::OnDecrypt() //解密按鈕 { UpdateData(); if(m_key.IsEmpty()||m_cipher.IsEmpty()) MessageBox("密鑰及密文不能為空!"); else{ Decode(m_key,m_explainted,m_cipher); UpdateData(false); m_explainted=""; m_ctrEDIT1.SetReadOnly(FALSE); m_ctrEDIT2.SetReadOnly(FALSE); m_ctrEDIT3.SetReadOnly(FALSE); m_ctrEDIT4.SetReadOnly(TRUE); } }

 


 

測試結果如下圖:

 

 

工程下載鏈接:

http://files.cnblogs.com/zoffy/VigenereCipher.zip

 


免責聲明!

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



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