首页 > 代码库 > 维吉尼亚密码加密、解密算法(破解还不会);

维吉尼亚密码加密、解密算法(破解还不会);

#include <iostream>
#include<cstdio>
using namespace std;
void init_pass_table(char (&code_table)[27][27]){//制密码对照表;(不能当做一维数组来看会有别的问题)
    code_table[0][0]=0;
    for(int i=0;i<26;i++){
        code_table[0][1+i]=a+i;
    }
    for(int i=0;i<26;i++){
        code_table[1+i][0]=a+i;
    }
    for(int i=0;i<26;i++){
        for(int j=0;j<26;j++){
            if(i+j>25){
                code_table[i+1][j+1]=a+j+i-26;
            }
            else
                code_table[i+1][j+1]=a+j+i;
        }
    }
}
void input_text(int a,char* text){//输入明文、密文或密码;//这个方法不用了;用的下边得那个,忘了删除了
    cin.sync();
    //for(int i=0;i<a;i++){
    cin.get(text,a+1);//这里可能有问题;
       // cin>>text[i];
}
int text_input(char a[1000]){
    gets(a);
    int d=0;
    for(int i=0;a[i]!=\0;i++){
        //cout<<a[i]<<‘ ‘;
        d++;
    }
    return d;
}
void make_pass_test(int d,char* a,int e,char* b,char c[27][27],int flag){//生成密文;a是明文;b是秘钥
   // cout<<c<<endl;
     /*int symbol=d;
    int ming_num=0;
    char new_mingwen[d];
    for(int i=0;i<d;i++){//明文去掉空格的长度;
        if(a[i]==‘ ‘){
            continue;
        }
        ming_num++;
    }
    cout<<"明文的有效长度"<<ming_num<<endl;
    for(int i=0;i<symbol;i++){
        new_mingwen[i]=a[i];
    }
    //cout<<new_mingwen<<endl;
    cout<<sizeof(new_mingwen)<<endl;//还没有更新的;
    for(int i=0;i<symbol;i++){//将new_mingwen[]的空格去掉,好在下边和秘钥查表;
        if(new_mingwen[i]==‘ ‘){
            for(int j=i;j<d-1;j++){
                new_mingwen[j]=new_mingwen[j+1];
            }
            symbol--;
        }
    }
    if(e>ming_num){
        cout<<"error"<<endl;
    }*/
    char new_miyao[d];
    int cf=0;
    if(e<d){//将秘钥做成和(明文或密文)一一对应的形式;
        for(int i=0;i<d;i++){
            if(a[i]== ){
                new_miyao[i]=a[i];
                cf++;
                continue;
            }
            else{
                int h=i-cf;
                while(h>=e){
                    h-=e;
                    }
                new_miyao[i]=b[h];
                }
        }
        //cout<<new_miyao<<endl;
    }
    if(flag==1){
        for(int i=0;i<d;i++){//一一对应在表里取值;
            if(a[d]== ){
                cout<< ;
                continue;
                }
            cout<<c[(int)(a[i]-96)][(int)(new_miyao[i]-96)];
            }
            cout<<endl;
    }
    if(flag==2){//对照表找到明文;
        for(int i=0;i<d;i++){
            if(new_miyao[i]== ){
                cout<< ;
                continue;
            }
            for(int j=0;j<27;j++){
                if(c[(int)(new_miyao[i]-96)][j]==a[i]){//找到对应的明文字母;
                    cout<<c[1][j];
                    break;
                    }
                }
        }
        cout<<endl;
    }
}
int main(){
    char code_table[27][27]={0};
    init_pass_table(code_table);
    int choose;
    while(1){
    cout<<"choose encode or decode(Enter ‘1‘ stand for encode;‘2‘-decode):"<<endl;
    cout<<"if you want out ,please Enter ‘3‘;"<<endl;
    cin>>choose;
    if(choose==1){
        int input_size,key_size;
        cout<<"请输入明文(可以包含空格)"<<endl;
        char mingwen[1000];
        gets(mingwen);
        input_size=text_input(mingwen);
        cout<<"请输入秘钥"<<endl;
        char miyao[1000];
        key_size=text_input(miyao);
        make_pass_test(input_size,mingwen,key_size,miyao,code_table,1);
    }
    else if(choose==2){
        int input_size,key_size;
        cout<<"请输入密文(可以包含空格)"<<endl;
        char miwen[1000];
        gets(miwen);
        input_size=text_input(miwen);
        cout<<"请输入秘钥"<<endl;
        char miyao[1000];
        key_size=text_input(miyao);
        make_pass_test(input_size,miwen,key_size,miyao,code_table,2);
    }
    else if(choose==3){
        break;
    }
    }
    return 0;
}

技术分享

 

维吉尼亚密码加密、解密算法(破解还不会);