Enigma代码
  • 板块灌水区
  • 楼主LZCH
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/9/19 22:12
  • 上次更新2023/11/4 06:09:30
查看原帖
Enigma代码
473862
LZCH楼主2021/9/19 22:12

Enigma模拟程序:

#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
char zmb[27] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char lt1[27] = {'c','s','p'}; //left turn 1转子1左
char lt2[27] = {'g','o','t'};
char lt3[27] = {'i','l','o','v','c','b','y'};
char fsb[27] = {'b','a','d','c','f','e','h','g','j','i','l','k','n','m','p','o','r','q','t','s','v','u','x','w','z','y'};
char rt1[27];
char rt2[27];
char rt3[27];
int jw1,jw2,jw3,wz1,wz2,wz3;
void init()
{
    //lt组的数组init。
    int k = 3;
    for (char x ='a'; x <= 'z'; ++x)
    {
        bool flag = true;
        for (int i = 0; i < 26; ++i)
            if (lt1[i] ==x)
            {
                flag = false;
                break;
            }
        if (flag)
        {
            lt1[k]= x;
            ++k;
        }
    }
    k = 3;
    for (char x ='a'; x <= 'z'; ++x)
    {
        bool flag = true;
        for (int i = 0; i < 26; ++i)
            if (lt2[i] ==x)
            {
                flag = false;
                break;
            }
        if (flag)
        {
            lt2[k]= x;
            ++k;
        }
    }
    k = 7;
    for (char x ='a'; x <= 'z'; ++x)
    {
        bool flag = true;
        for (int i = 0; i < 26; ++i)
            if (lt3[i] ==x)
            {
                flag = false;
                break;
            }
        if (flag)
        {
            lt3[k]= x;
            ++k;
        }
    }
    //rt组的数组init。
    for (int i = 0; i < 26; ++i)
        rt1[lt1[i]- 'a'] = i + 'a';
    for (int i = 0; i < 26; ++i)
        rt2[lt2[i]- 'a'] = i + 'a';
    for (int i = 0; i < 26; ++i)
        rt3[lt3[i]- 'a'] = i + 'a';
}
char jiami(char in){
    //char out;
    //char tp;
    in = lt1[in-'a'];
    in = lt2[in-'a'];
    in = lt3[in-'a'];
    in = fsb[in-'a'];
    in = rt3[in-'a'];
    in = rt2[in-'a'];
    in = rt1[in-'a'];
    return in;
}
void littleturn(char* lt, char* rt, int &wz){
    char tp;
    tp = lt[0];
    for(int i=0;i<25;i++){
        lt[i]=lt[i+1];
    }
    lt[25]=tp;
    wz++;
    for (int i = 0; i < 26; ++i)
        rt[lt[i]- 'a'] = i + 'a';
}
void turn(){
    //turn lt1,2,3
    char tp;
    tp = lt1[0];
    for(int i=0;i<25;i++){
        lt1[i]=lt1[i+1];
    }
    lt1[25]=tp;
    wz1++;

    if(wz1>=26){
        wz1 = 0;
    }
    if(wz1 == jw1){
        tp = lt2[0];
        for(int i=0;i<25;i++){
            lt2[i]=lt2[i+1];
        }
        lt2[25]=tp;
        wz2++;
        if(wz2>=26){
            wz2 = 0;
        }
        if(wz2==jw2){
            tp = lt1[0];
            for(int i=0;i<25;i++){
                lt1[i]=lt1[i+1];
            }
            lt1[25]=tp;
            wz3++;
            if(wz3>=26){
                wz3=0;
            }
        }
    }
    //make rt1,2,3
    for (int i = 0; i < 26; ++i)
        rt1[lt1[i]- 'a'] = i + 'a';
    for (int i = 0; i < 26; ++i)
        rt2[lt2[i]- 'a'] = i + 'a';
    for (int i = 0; i < 26; ++i)
        rt3[lt3[i]- 'a'] = i + 'a';
}
int main()
{
    init();

    cout<<"欢迎使用Enigma1.0.0,这个程序由刘梓宸在2021年9月19日13分00秒完成初版,在2021年9月19日13分00秒完成最后更新。\n";
    Sleep(5000);
    system("cls");
    cout<<"请输入第一个转子的位置:";
    int temp;
    cin>>temp;
    littleturn(lt1,rt1,wz1);
    cout<<"请输入第一个转子的进位点:";
    cin>>temp;
    jw1 = temp;

    cout<<"请输入第二个转子的位置:";
    cin>>temp;
    littleturn(lt2,rt2,wz2);
    cout<<"请输入第二个转子的进位点:";
    cin>>temp;
    jw2 = temp;

    cout<<"请输入第三个转子的位置:";
    cin>>temp;
    littleturn(lt3,rt3,wz3);
    /*cout<<"请输入第三个转子的进位点:";
    cin>>temp;
    jw3 = temp;*/
    system("cls");
    cout<<"加密程序只支持小写字母。"<<endl;
    Sleep(1500);
    system("cls");

    char nowin;//, nowout;
    while(true){
        nowin = getch();
        if(nowin>='a'&&nowin<='z'){
            nowin=jiami(nowin);
        }
        cout<<nowin;
        turn();
    }
}

2021/9/19 22:12
加载中...