四種古典密碼的C++實現(4)-----Caesar密碼

-CQ-發表於2017-10-25
//Caesar密碼
/*理解演算法最重要,最好自己動手實現試試看,可以使用MFC寫一個簡單的互動介面*/
#include<iostream>
#include<cmath>
using namespace std;

#define N 1000  
//全域性變數
char str[100];     //用於儲存處理前字串
char enstr[100];   //用於儲存處理後字串
int num=0;           //用於累計字元數量
char *p;           //用於指向處理字串
int key;

//加密
void encryption()
{
    while(*p!='\0')
    {   
        *p=(*p-97+key)%26+97;
        p++;
    }
    cout<<"加密後字元:"<<str<<endl<<endl;
}
//解密
void decryption()
{
    while(*p!='\0')
    {
        *p=(*p-71-key)%26+97;
        p++;
    }
    cout<<"解密後字元:"<<str<<endl<<endl;
}
//單文字破解 
void get_key()
{   
    char e;
    char d;
    cout<<"請輸入已知位置明文:";
    cin>>e;
    cout<<"請輸入已知位置密文:";
    cin>>d;
    key=abs(e-d)%26;
    cout<<"金鑰為:"<<key<<endl;
}
//全結果破解 
void decrypt()  
{  
    char x[N];
    
    cout<<"請輸入加密後的明文:\n";
    cin>>x;
    for(int i=1;i<=25;++i)  
    {  
        for(int j=0;;++j)  
        {  
            if(x[j]>96&&x[j]<123)        
                x[j]=(x[j]-1-122)%26+122;  
            else if(x[j]>64&&x[j]<91)  
                x[j]=(x[j]-1-90)%26+90;  
            else  
                x[j]=x[j];  
            if(x[j]==0) break;  
        }  
        cout<<"祕鑰為 "<<i<<"時,此祕鑰加密前的原文為:"<<x<<endl;  
    }  
} 
//主函式 
int main()
{    
    string ord;
    while(1)
    {
        cout<<"請選擇功能:\n";
        cout<<"1.Encryption(加密)\n2.Decryption(解密)\n3.Decipher(破解)\n4.Exit(退出)       :  ";
        
        p=str;
        cin>>ord;
        if(ord=="1")
        {
            cout<<"Input:請輸入需要加密的內容(不支援空格和其他字元)"<<endl;
            cin>>str;
            p=str;
            cout<<"Key:請輸入金鑰  ";
            cin>>key;
            encryption();

        }
        else if(ord=="2") 
        {
            cout<<"Input:請輸入需要解密的內容(不支援空格和其他字元):"<<endl;
            cin>>str;
            p=str;
            cout<<"Key:請輸入金鑰  ";
            cin>>key;
            decryption();
        }
        else if(ord=="3") 
        {
            cout<<"完全未知密文,輸入明文列出所有可能請輸入 1;\n已知某個明文字母的對應密文請輸入 2;\n";
            int choose; cin>>choose;
            if(choose==1)
                decrypt(); 
            else if(choose==2)
                get_key();
        }
        else if(ord=="4") break;
        else 
        {
            cout<<"Error :輸入錯誤,請重新開始\n";
            continue;
        } 
        
    }
    
    return 0; 
}

相關文章