凯撒加密+Vigenere密码+Hill密码+S盒,C++实现(homework)

1、凯撒密码:

#include <iostream>
#include <map>
#include <string.h>

using namespace std;

char index[26];// 0~25 对应 a~z 
map<char,int> M;//first存放字母,second存放字母在数组index中对应的下标 


void init(){
    for(int i=0;i<26;i++){
        index[i]='a'+i;
        M[index[i]]=i;
    }
}

void PrintData(){
    for(int i=0;i<26;i++)
        cout<<index[i]<<" ";
    cout<<endl;
    
    map<char,int>::iterator it=M.begin();    
    while(it!=M.end()){
        cout<<it->first<<" "<<it->second<<endl;
        it++;
    }        
}

void CaesarEncoder(){
    int k;
    string m;
    cout<<"Caesar凯撒加密系统"<<endl;
    cout<<"请输入密钥k(k<=25):";
    cin>>k;
    cout<<"请输入明文:";
    cin>>m;
    int len=m.size();
    for(int i=0;i<len;i++){
        int pos=M[m[i]];
        pos=(pos+k)%26;
        m[i]=index[pos];
    }
    cout<<"对应密文为:"<<m<<endl;    
}

void CaesarDecoder(){
    int k;
    string m;
    cout<<"Caesar凯撒解密系统"<<endl;
    cout<<"请输入密钥k(k<=25):";
    cin>>k;
    cout<<"请输入密文:";
    cin>>m;
    int len=m.size();
    for(int i=0;i<len;i++){
        int pos=M[m[i]];
        pos=(pos-k)%26;
        m[i]=index[pos];
    }
    cout<<"对应明文为:"<<m<<endl;    
}

int main(int argc, char** argv) {
    init();
//    PrintData();
    CaesarEncoder();
    cout<<endl; 
    CaesarDecoder();
    return 0;
}


2、Vigenere密码:
#include <iostream>
#include <string.h>
#include <map>

using namespace std;

char arr[26];
map<char,int> M;
char src[26][26];
string key;
string plain;

void init(){
    for(int i=0;i<26;i++)
        arr[i]='a'+i;
        
    for(int i=0;i<26;i++){
        char c='a'+i;
        M[c]=i;
    }
    
    for(int i=0;i<26;i++){
        char c='a'+i;//每行的起始字母 
        int pos=M[c];
        for(int j=0;j<26;j++){            
            pos%=26;
            src[i][j]=arr[pos];
            pos++;
        }
    }
    cout<<"=================Vigenere密码加密系统================="<<endl;
    cout<<"请输入密钥:"<<endl;
    cin>>key;
    cout<<"请输入明文:"<<endl;
    cin>>plain;
}

void PrintData(){
    cout<<"打印arr"<<endl;
    for(int i=0;i<26;i++)
        cout<<arr[i]<<" ";
    cout<<endl<<"打印M"<<endl; 
    
    auto it=M.begin();
    while(it!=M.end()){
        cout<<it->first<<" "<<it->second<<endl;
        it++;
    }
    
    for(int i=0;i<26;i++){
        for(int j=0;j<26;j++){
            cout<<src[i][j]<<" ";
        }
        cout<<endl;
    }
}

void Encode(){
    
    string res=key;
    for(int i=0;i<26;i++){
        int x=M[key[i]];
        int y=M[plain[i]];
        res[i]=src[x][y];
    }
    cout<<"输出密文:"<<res<<endl; 
}

int main(int argc, char** argv) {
    init();
//    PrintData();
    Encode();
    
    return 0;
}

3、Hill密码:

#include <iostream>
#include <map>
#include <string.h>

using namespace std;

char arr[26];// 0~25 对应 a~z 
map<char,int> Index;//first存放字母,second存放字母在数组index中对应的下标 
int m;//明文长度 
    int K[1000][1000];
    int P[1000];
    int C[1000];
    
    
void init(){
    for(int i=0;i<26;i++){
        arr[i]='a'+i;
        Index[arr[i]]=i;
    }
}

void Encode(){
    cout<<"=================Hill密码加密系统===================="<<endl;
    string pt;
    cout<<"请输入明文:";
    cin>>pt;
    m=pt.size();

    cout<<"请输入"<<m<<"X"<<m<<"的加密矩阵(密钥):"<<endl;
    for(int i=0;i<m;i++){
        for(int j=0;j<m;j++)
            cin>>K[i][j];
    }
    
    for(int i=0;i<m;i++)
        P[i]=Index[pt[i]];
    
    for(int i=0;i<m;i++){
        C[i]=0;
        for(int j=0;j<m;j++){
            C[i]+=K[i][j]*P[j];
        }
        C[i]%=26;
    }
    cout<<"输出密文:"<<endl;
    for(int i=0;i<m;i++)
        cout<<arr[C[i]];
    cout<<endl;

void PrintData(){
    
    cout<<"打印加密矩阵"<<endl; 
    for(int i=0;i<m;i++){
        for(int j=0;j<m;j++)
            cout<<K[i][j]<<" ";
        cout<<endl;
    }
    cout<<"打印明文对应的转置矩阵"<<endl;
    for(int i=0;i<m;i++)
        cout<<P[i]<<" ";
    cout<<endl;
    
    
    cout<<"打印密文转置矩阵"<<endl;
    for(int i=0;i<m;i++)
        cout<<C[i]<<" ";
    cout<<endl; 
    
    cout<<"输出密文:"<<endl;
    for(int i=0;i<m;i++)
        cout<<arr[C[i]];
    cout<<endl;
}

/*
样例输入:cost 
        1 3 5 7
        10 4 6 8
        2 3 6 9
        11 12 8 5
样例输出:
        hynn 
*/    

int main(int argc, char** argv) {
    init();
    Encode();
//    PrintData();

    return 0;
}

4、S盒:

#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

int S[32][16];// 8个 4*16的矩阵
string plain;//明文

int getRandom(long long a,long long b){
    return rand()%(b-a+1)+a;
}

void init(){
    int arr[16];
    for(int i=0;i<16;i++)// arr:源数据池 
        arr[i]=i;
    
    //随机获取S盒子中4*8 行 数据(1~15的全排列) 
    int cnt=0;
    do{
        int pivot=getRandom(0,20202020);
        if(pivot!=2020)
            continue;                
        for(int i=0;i<16;i++)
            S[cnt][i]=arr[i];
        cnt++;
        if(cnt==32)
            break;        
    }while(next_permutation(arr,arr+16));
    

void PrintS(){
    for(int i=0;i<32;i++){
        if(i>0 && i%4==0)
            cout<<endl;
        for(int j=0;j<16;j++){
            cout<<S[i][j]<<" ";
        }
        cout<<endl;        
    }
}

int CtoI(char c){
    return c-'0';
}

string Dec2Bin(int Dec){
    
    string bin="";
    while(Dec){
        int tmp=Dec%2;
        char c='0'+tmp;
        Dec/=2;
        bin+=c;
    }
    reverse(bin.begin(),bin.end());
    
    if(bin.size()<4){//校验4位输出 
        for(int i=0;i<=4-bin.size();i++)
            bin="0"+bin;
    }
    return bin;    
}

void Encode(){
    cout<<"==================S盒密码加密系统=================="<<endl;
    cout<<"请输入明文(6位二进制输入):"<<endl;
    cin>>plain;
    
    int x=CtoI(plain[0])*2 + CtoI(plain[5]);
    int y=CtoI(plain[1])*8 + CtoI(plain[2])*4 + CtoI(plain[3])*2 + CtoI(plain[4]);
    
    int res=S[x][y];//获得10进制密文输出
    cout<<"对应密文为:"<<Dec2Bin(res)<<endl;    
}

int main(int argc, char** argv) {
    init();
//    PrintS();
    Encode();
    
    return 0;
}

当然可以!下面是一个使用C++实现Vigenere密码的加密的示例代码: ```cpp #include <iostream> #include <string> std::string encryptVigenere(const std::string& plainText, const std::string& key) { std::string encryptedText = plainText; int keyLength = key.length(); int textLength = plainText.length(); for (int i = 0; i < textLength; i++) { char plainChar = plainText[i]; char keyChar = key[i % keyLength]; char encryptedChar; if (isalpha(plainChar)) { if (islower(plainChar)) { encryptedChar = 'a' + (plainChar - 'a' + toupper(keyChar) - 'A') % 26; } else { encryptedChar = 'A' + (plainChar - 'A' + toupper(keyChar) - 'A') % 26; } } else { encryptedChar = plainChar; } encryptedText[i] = encryptedChar; } return encryptedText; } int main() { std::string plainText, key; std::cout << "Enter the plain text: "; std::getline(std::cin, plainText); std::cout << "Enter the key: "; std::getline(std::cin, key); std::string encryptedText = encryptVigenere(plainText, key); std::cout << "Encrypted text: " << encryptedText << std::endl; return 0; } ``` 这个示例代码中的 `encryptVigenere` 函数接受两个参数:明文和密钥。它会对明文进行 Vigenere 加密,并返回加密后的密文。 在 `main` 函数中,用户可以输入明文和密钥,然后调用 `encryptVigenere` 函数进行加密,并输出加密后的密文。 请注意,这只是一个简单的实现示例,没有包含对输入的合法性进行检查。在实际应用中,你可能需要添加更多的错误处理和边界情况的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值