相信各位看了《模仿游戲》之後,都會對這個二戰的加密方法感到很好奇吧,我也不例外,因此編了個程序實現了恩格瑪加密機,這機器最大的特點就是有著自反性,只要初始設置一致的時候,那麼它就是自反的,比如輸入A,加密後B,在一樣的設置下,輸入B一定會輸出A。
下面我實現的是簡化版的,沒有插線板(如果加上去也是很簡單的,只需要替換指定的字母就可以了,這裡為了簡潔就不添加了)
#include
#include
using namespace std;
string Enigma(string input){
int code;
int n[6] = {24,2,5,4,10,23}; //定義6個轉子
int nsize=6;
string output;
for (int i = 0; i < input.size();i++)
{
if(input[i]==' '){output+=' ';continue;}
code = input[i]-'a';
for (int j = 0; j < nsize;j++)
{
code = (code + n[j]) % 26;
}
if(code%2==0) code++;else code--; //反射器如果偶數+1,奇數-1,反射器只要能實現字母兩兩配對就可以了。
for (int j = nsize-1; j >=0;j--)
{
code = code - n[j];
if(code<0)code=26+code;
}
n[0]++;
for (int j = 0; j < nsize-1; j++)
{
if (n[j]>=26)
{
n[j + 1]++;
n[j] = 0;
}
}
n[nsize-1] = n[nsize-1] % 26;
output += code+'a';
}
return output;
}
int main()
{
string text=hey hey helloworld;
string miwen=Enigma(text);
cout <<密文:<< miwen<< endl;
cout <<明文:<< Enigma(miwen) << endl;
return 0;
}