四种古典密码的C++实现(4)-----Caesar密码

//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; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值