1. 程式人生 > >古典密碼演算法 凱撒(Caesar)密碼,又叫迴圈移位密碼

古典密碼演算法 凱撒(Caesar)密碼,又叫迴圈移位密碼


古典密碼演算法曾被廣泛應用,大都比較簡單,使用手工和機械操作來實現加密和解密。它的主要應用物件是文字資訊,利用密碼演算法實現文字資訊的加密和解密。下面介紹兩種常見的具有代表性的古典密碼演算法,以幫助讀者對密碼演算法建立一個初步的印象。

1. 替代密碼

替代密碼的原理是使用替代法進行加密,就是將明文由其它的字母、數字或符合所代替後形成密文。這裡每個明文字母對應的密文字母可能是一個,也可能是多個。接收者對密文進行逆向替換即可得到明文。替代密碼有五種表現形式:

1單表代替

即簡單替代密碼或者稱為單字母代替,明文字母表中的一個字元對應密文字母表中的一個字元。這是所有加密中最簡單的方法。 

2多名碼代替

就是將明文字母表中的字元對映為密文字母表中的多個字元。多名碼簡單代替早在1401年就由DuchyMantua公司使用。在英文中,母音字母出現頻率最高,降低對應密文字母出現頻率的一種方法就是使用多名碼,如e可能被密文51325替代。 

3多音碼代替

就是將多個明文字元代替為一個密文字元。比如將字母“i” “j”對應為“K”“v”“w”代替為“L”最古老的這種多字母加密始見於1563年由波他的《密寫評價》(De furtiois literarum notis)一書。 

4多表代替

即由多個簡單代替組成,也就是使用了兩個或兩個以上的代替表。比如使用有5個簡單代替表的代替密碼,明文的第一個字母用第一個代替表,第二個字母用第二個表,第三個字母用第三個表,以此類推,迴圈使用這五張代替表。多表代替密碼由萊昂

.巴蒂斯塔於1568年發明,著名的維吉尼亞密碼和博福特密碼均是多表代替密碼。

下面我們介紹一種典型的單表替代密碼——凱撒(Caesar)密碼,又叫迴圈移位密碼。它的加密方法就是將明文中的每個字母用字母表中該字母后的第R個字母來替換,達到加密的目的。它的加密過程可以表示為下面的函式:


其中,m為明文字母在字母表中的位置數;n為字母表中的字母個數;k為金鑰; 為密文字母在字母表中對應的位置數。

    例如:對於明文字母H,其在字母表中的位置數為8,設,則按照上式計算出來的密文為L,計算過程如下:


程式碼為:

#include <iostream>
using namespace std;
# define N 26
int searchnum(char t)
    {
        char r;
        char str[26];
        for(int i=1,r='A';i<=N;i++,r++)
        {
            str[i]=r;
        }
        for(int i=1;i<=N;i++)
        {
            if(t==str[i])
            return i;
        }
    }
char searchchar(int t)
{
        char r;
        char str[26];
        for(int i=1,r='A';i<=N;i++,r++)
        {
            str[i]=r;
        }
        for(int i=1;i<=N;i++)
        {
            if(t==i)
            return str[i];
        }
}
void jiami()
{
    char str[50];
    int k;
    cout<<"請輸入您的金鑰:"<<endl;
    //int m;
    //char s;
    cin>>k;
    cout<<"請輸入您的明文:"<<endl;
    cin>>str;
    for(int i=0;str[i]!='\0';i++)
    {
        int a,b;
        char ch=str[i];
        int m=searchnum(ch);
        a=m+k;
        b=a%26;
        char c=searchchar(b);
        str[i]=c;
    }
    cout<<"您的密文是:"<<endl;
    for(int i=0;str[i]!='\0';i++)
    {
        cout<<str[i];
    }
}
void jiemi()
{
    char str[50];
    int k;
    cout<<"請輸入您的金鑰:"<<endl;
    //int m;
    //char s;
    cin>>k;
    cout<<"請輸入您的密文:"<<endl;
    cin>>str;
    for(int i=0;str[i]!='\0';i++)
    {
        int a,b;
        char ch=str[i];
        int m=searchnum(ch);
        if(m<k)
        {
            a=m+N-k;
            b=a%N;
        }
        else if(m>k)
        {
            a=m-k;
            b=a%N;
        }
        else
        {
            b=N;
        }
        char c=searchchar(b);
        str[i]=c;
    }
    cout<<"您的明文是:"<<endl;
    for(int i=0;str[i]!='\0';i++)
    {
        cout<<str[i];
    }
}
int main()
{
    int choice;
    cout<<"請輸入您的選擇:"<<endl;
    cout<<"1.加密;2.解密;"<<endl;
    cin>>choice;
    switch (choice)
    {
        case 1:
            jiami();
            break;
        case 2:
            jiemi();
            break;
        default:
            break;
    }
       // cout << searchnum(s)<< endl;
    return 0;
}


實現加密與解密