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();
}
}