C程序模拟3转子的恩格玛机
时间:01-20 10:15 阅读:883次
*温馨提示:点击图片可以放大观看高清大图
简介:本文和大家分享一个C程序模拟3转子的恩格玛机,感兴趣的朋友可以看看。
#include "stdafx.h"
#include "egm1.h"
zz zz_1;//定义3个转子
zz zz_2;
zz zz_3;
int fs[13][2];//定义反射板
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ege1_init()
{
//初始化恩格玛机
zz_1.d=0;
zz_2.d=0;
zz_3.d=0;
//定义1号转子的接线盘
zz_1.lj[0][0]=0;
zz_1.lj[0][1]=2;
zz_1.lj[1][0]=1;
zz_1.lj[1][1]=4;
zz_1.lj[2][0]=2;
zz_1.lj[2][1]=6;
zz_1.lj[3][0]=3;
zz_1.lj[3][1]=8;
zz_1.lj[4][0]=4;
zz_1.lj[4][1]=10;
zz_1.lj[5][0]=5;
zz_1.lj[5][1]=12;
zz_1.lj[6][0]=6;
zz_1.lj[6][1]=14;
zz_1.lj[7][0]=7;
zz_1.lj[7][1]=16;
zz_1.lj[8][0]=8;
zz_1.lj[8][1]=18;
zz_1.lj[9][0]=9;
zz_1.lj[9][1]=20;
zz_1.lj[10][0]=10;
zz_1.lj[10][1]=22;
zz_1.lj[11][0]=11;
zz_1.lj[11][1]=24;
zz_1.lj[12][0]=12;
zz_1.lj[12][1]=25;
zz_1.lj[13][0]=13;
zz_1.lj[13][1]=1;
zz_1.lj[14][0]=14;
zz_1.lj[14][1]=3;
zz_1.lj[15][0]=15;
zz_1.lj[15][1]=5;
zz_1.lj[16][0]=16;
zz_1.lj[16][1]=7;
zz_1.lj[17][0]=17;
zz_1.lj[17][1]=9;
zz_1.lj[18][0]=18;
zz_1.lj[18][1]=11;
zz_1.lj[19][0]=19;
zz_1.lj[19][1]=13;
zz_1.lj[20][0]=20;
zz_1.lj[20][1]=15;
zz_1.lj[21][0]=21;
zz_1.lj[21][1]=17;
zz_1.lj[22][0]=22;
zz_1.lj[22][1]=19;
zz_1.lj[23][0]=23;
zz_1.lj[23][1]=21;
zz_1.lj[24][0]=24;
zz_1.lj[24][1]=23;
zz_1.lj[25][0]=25;
zz_1.lj[25][1]=0;
//定义2号转子的接线盘
zz_2.lj[0][0]=0;
zz_2.lj[0][1]=2;
zz_2.lj[1][0]=1;
zz_2.lj[1][1]=4;
zz_2.lj[2][0]=2;
zz_2.lj[2][1]=6;
zz_2.lj[3][0]=3;
zz_2.lj[3][1]=8;
zz_2.lj[4][0]=4;
zz_2.lj[4][1]=10;
zz_2.lj[5][0]=5;
zz_2.lj[5][1]=12;
zz_2.lj[6][0]=6;
zz_2.lj[6][1]=14;
zz_2.lj[7][0]=7;
zz_2.lj[7][1]=16;
zz_2.lj[8][0]=8;
zz_2.lj[8][1]=18;
zz_2.lj[9][0]=9;
zz_2.lj[9][1]=20;
zz_2.lj[10][0]=10;
zz_2.lj[10][1]=22;
zz_2.lj[11][0]=11;
zz_2.lj[11][1]=24;
zz_2.lj[12][0]=12;
zz_2.lj[12][1]=25;
zz_2.lj[13][0]=13;
zz_2.lj[13][1]=1;
zz_2.lj[14][0]=14;
zz_2.lj[14][1]=3;
zz_2.lj[15][0]=15;
zz_2.lj[15][1]=5;
zz_2.lj[16][0]=16;
zz_2.lj[16][1]=7;
zz_2.lj[17][0]=17;
zz_2.lj[17][1]=9;
zz_2.lj[18][0]=18;
zz_2.lj[18][1]=11;
zz_2.lj[19][0]=19;
zz_2.lj[19][1]=13;
zz_2.lj[20][0]=20;
zz_2.lj[20][1]=15;
zz_2.lj[21][0]=21;
zz_2.lj[21][1]=17;
zz_2.lj[22][0]=22;
zz_2.lj[22][1]=19;
zz_2.lj[23][0]=23;
zz_2.lj[23][1]=21;
zz_2.lj[24][0]=24;
zz_2.lj[24][1]=23;
zz_2.lj[25][0]=25;
zz_2.lj[25][1]=0;
//定义3号转子的接线盘
zz_3.lj[0][0]=0;
zz_3.lj[0][1]=2;
zz_3.lj[1][0]=1;
zz_3.lj[1][1]=4;
zz_3.lj[2][0]=2;
zz_3.lj[2][1]=6;
zz_3.lj[3][0]=3;
zz_3.lj[3][1]=8;
zz_3.lj[4][0]=4;
zz_3.lj[4][1]=10;
zz_3.lj[5][0]=5;
zz_3.lj[5][1]=12;
zz_3.lj[6][0]=6;
zz_3.lj[6][1]=14;
zz_3.lj[7][0]=7;
zz_3.lj[7][1]=16;
zz_3.lj[8][0]=8;
zz_3.lj[8][1]=18;
zz_3.lj[9][0]=9;
zz_3.lj[9][1]=20;
zz_3.lj[10][0]=10;
zz_3.lj[10][1]=22;
zz_3.lj[11][0]=11;
zz_3.lj[11][1]=24;
zz_3.lj[12][0]=12;
zz_3.lj[12][1]=25;
zz_3.lj[13][0]=13;
zz_3.lj[13][1]=1;
zz_3.lj[14][0]=14;
zz_3.lj[14][1]=3;
zz_3.lj[15][0]=15;
zz_3.lj[15][1]=5;
zz_3.lj[16][0]=16;
zz_3.lj[16][1]=7;
zz_3.lj[17][0]=17;
zz_3.lj[17][1]=9;
zz_3.lj[18][0]=18;
zz_3.lj[18][1]=11;
zz_3.lj[19][0]=19;
zz_3.lj[19][1]=13;
zz_3.lj[20][0]=20;
zz_3.lj[20][1]=15;
zz_3.lj[21][0]=21;
zz_3.lj[21][1]=17;
zz_3.lj[22][0]=22;
zz_3.lj[22][1]=19;
zz_3.lj[23][0]=23;
zz_3.lj[23][1]=21;
zz_3.lj[24][0]=24;
zz_3.lj[24][1]=23;
zz_3.lj[25][0]=25;
zz_3.lj[25][1]=0;
//定义反射板接线盘
fs[0][0]=0;
fs[0][1]=1;
fs[1][0]=2;
fs[1][1]=3;
fs[2][0]=4;
fs[2][1]=5;
fs[3][0]=6;
fs[3][1]=7;
fs[4][0]=8;
fs[4][1]=9;
fs[5][0]=10;
fs[5][1]=11;
fs[6][0]=12;
fs[6][1]=13;
fs[7][0]=14;
fs[7][1]=15;
fs[8][0]=16;
fs[8][1]=17;
fs[9][0]=18;
fs[9][1]=19;
fs[10][0]=20;
fs[10][1]=21;
fs[11][0]=22;
fs[11][1]=23;
fs[12][0]=24;
fs[12][1]=25;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int getfs(int data)
{
//用反射板进行一次数据转换
int i;
for(i=0;i<=12;i++)
{
if(fs[i][0]==data) return fs[i][1];
}
for(i=0;i<=12;i++)
{
if(fs[i][1]==data) return fs[i][0];
}
return 88;//错误
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int getzz_R( zz ZZ,int data)
{
//用转子进行一次数据转换 从右往左
int i;
for(i=0;i<=25;i++)
{
if(ZZ.lj[i][0]==data) return ZZ.lj[i][1];
}
return 88;//错误
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int getzz_L( zz ZZ,int data)
{
//用转子进行一次数据转换 从左往右
int i;
for(i=0;i<=25;i++)
{
if(ZZ.lj[i][1]==data) return ZZ.lj[i][0];
}
return 88;//错误
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int getzz1_R(int data)
{
return getzz_R(zz_1,data);
}
int getzz1_L(int data)
{
return getzz_L(zz_1,data);
}
int getzz2_R(int data)
{
return getzz_R(zz_2,data);
}
int getzz2_L(int data)
{
return getzz_L(zz_2,data);
}
int getzz3_R(int data)
{
return getzz_R(zz_3,data);
}
int getzz3_L(int data)
{
return getzz_L(zz_3,data);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setkey(int zz1,int zz2,int zz3)
{
//设置密钥
zz_1.d=zz1;
zz_2.d=zz2;
zz_3.d=zz3;
}
int jiami(int data)
{
//对一个字符进行加密
data=data+zz_1.d;
if(data>25) data-=26; //修正并定位转动后的1号转子的触点位置
data=getzz1_R(data); //经过第一个转子的处理
if(zz_1.d<zz_2.d)
{
//2号转动次数比1号多
data=data+(zz_2.d-zz_1.d);
if(data>25) data-=26; //修正并定位转动后的2号转子的触点位置
}
if(zz_1.d>zz_2.d)
{
//2号转动次数比1号少
data=data-(zz_1.d-zz_2.d);
if(data<0) data+=26; //修正并定位转动后的2号转子的触点位置
}
data=getzz2_R(data); //经过第2个转子的处理
if(zz_2.d<zz_3.d)
{
//3号转动次数比2号多
data=data+(zz_3.d-zz_2.d);
if(data>25) data-=26; //修正并定位转动后的2号转子的触点位置
}
if(zz_2.d>zz_3.d)
{
//3号转动次数比2号少
data=data-(zz_2.d-zz_3.d);
if(data<0) data+=26; //修正并定位转动后的2号转子的触点位置
}
data=getzz3_R(data); //经过第3个转子的处理
////////////////////////////////////////////////////////////////////////////////////
//反射后处理
data=data-zz_3.d;
if(data<0) data+=26;
data=getfs(data); //经过反射板的处理
data=data+zz_3.d;
if(data>25) data-=26; //修正并定位反射后的3号转子的触点位置
data=getzz3_L(data); //经过第3个转子的处理
if(zz_3.d<zz_2.d)
{
//2号转动次数比3号多
data=data+(zz_2.d-zz_3.d);
if(data>25) data-=26; //修正并定位转动后的2号转子的触点位置
}
if(zz_3.d>zz_2.d)
{
//2号转动次数比3号少
data=data-(zz_3.d-zz_2.d);
if(data<0) data+=26; //修正并定位转动后的2号转子的触点位置
}
data=getzz2_L(data); //经过第2个转子的处理
if(zz_2.d<zz_1.d)
{
//2号转动次数比3号多
data=data+(zz_1.d-zz_2.d);
if(data>25) data-=26; //修正并定位转动后的2号转子的触点位置
}
if(zz_2.d>zz_1.d)
{
//2号转动次数比3号少
data=data-(zz_2.d-zz_1.d);
if(data<0) data+=26; //修正并定位转动后的2号转子的触点位置
}
data=getzz1_L(data); //经过第1个转子的处理
data=data-zz_1.d;
if(data<0) data+=26;//最后返回的数据
/////////////
//转子转动
if(zz_1.d<25) zz_1.d++;else zz_1.d=0;
if(zz_2.d<25) {if((zz_1.d%2)==0) zz_2.d++;} else zz_2.d=0;
if(zz_3.d<25) {if((zz_1.d%3)==0) zz_3.d++;} else zz_3.d=0;
/////////////
return data;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////