標(biāo)題:
30轉(zhuǎn)子恩格瑪機(jī)對(duì)文件進(jìn)行加密C++源程序
[打印本頁(yè)]
作者:
51黑黑
時(shí)間:
2016-1-6 01:57
標(biāo)題:
30轉(zhuǎn)子恩格瑪機(jī)對(duì)文件進(jìn)行加密C++源程序
//加密機(jī)轉(zhuǎn)子類
class egm_zz
{
public:
//公共的行為或?qū)傩?br />
egm_zz(char *r,char *l);//構(gòu)造函數(shù)(參數(shù)為接線盤排列信息)
void set_wz(char key);//設(shè)置密鑰(轉(zhuǎn)子初始位置)
void set_guize(int gz);//設(shè)置轉(zhuǎn)動(dòng)規(guī)則(加密多少字節(jié)轉(zhuǎn)動(dòng)一次轉(zhuǎn)子)
char get_wz();//返回轉(zhuǎn)子位置
char get_R_L(char data);//從右往左進(jìn)行一次替換
char get_L_R(char data);//從左往右進(jìn)行一次替換
void go();//轉(zhuǎn)子進(jìn)行一次轉(zhuǎn)動(dòng)判定
private:
//私有的行為或?qū)傩?br />
char R[256];//轉(zhuǎn)子右接線盤
char L[256];//轉(zhuǎn)子左接線盤
char wz;//轉(zhuǎn)子位置
int guize;//轉(zhuǎn)子轉(zhuǎn)動(dòng)規(guī)則
int guize_A;//轉(zhuǎn)動(dòng)數(shù)據(jù)累加器
};
//加密機(jī)反射板類
class egm_fs
{
public:
//公共的行為或?qū)傩?br />
egm_fs(char *r,char *l);//構(gòu)造反射板
char get_fs(char data);//進(jìn)行一次數(shù)據(jù)替換
private:
//私有的行為或?qū)傩?br />
char R[128];//反射板接線盤共128對(duì)接線分別對(duì)應(yīng)0x00~0xFF
char L[128];
};
//定義30轉(zhuǎn)子的恩格瑪機(jī)
class egm_30
{
public:
//公共的行為或?qū)傩?br />
egm_30();//構(gòu)造函數(shù)
void set_key_wz(char *key);//設(shè)置密鑰串的轉(zhuǎn)子位置部分(30個(gè))
void set_key_guize(int *key);//設(shè)置密鑰串的轉(zhuǎn)子轉(zhuǎn)動(dòng)規(guī)則部分(30個(gè))
char jiami(char data);//對(duì)一個(gè)字節(jié)進(jìn)行加密
private:
//私有的行為或?qū)傩?br />
egm_zz *zz[30];//30個(gè)轉(zhuǎn)子對(duì)象
egm_fs *fs;//1個(gè)反射板對(duì)象
};
//對(duì)一個(gè)字節(jié)進(jìn)行加密(核心算法)
char egm_30::jiami(char data)
{
int i;
int d;
d=data;
d=d+zz[0]->get_wz();
if(d>255) d-=256; //修正并定位轉(zhuǎn)動(dòng)后的0號(hào)轉(zhuǎn)子的觸點(diǎn)位置
d=zz[0]->get_R_L((char)d);
//1號(hào)到29號(hào)轉(zhuǎn)子從右往左處理一輪
for(i=0;i<29;i++)
{
if(zz[i]->get_wz()<zz[i+1]->get_wz())
{
d=d+(zz[i+1]->get_wz()-zz[i]->get_wz());
if(d>255) d-=256;
}
if(zz[i]->get_wz()>zz[i+1]->get_wz())
{
d=d-(zz[i]->get_wz()-zz[i+1]->get_wz());
if(d<0) d+=256;
}
d=zz[i+1]->get_R_L((char)d);
}
//反射板處理一次數(shù)據(jù)
d=d-zz[29]->get_wz();
if(d<0) d+=256;
d=fs->get_fs((char)d);
//29號(hào)轉(zhuǎn)子左到右處理
d=d+zz[29]->get_wz();
if(d>255) d-=256;
d=zz[29]->get_L_R((char)d);
//28號(hào)到0號(hào)轉(zhuǎn)子從左往右處理一輪
for(i=29;i>0;i--)
{
if(zz[i]->get_wz()<zz[i-1]->get_wz())
{
d=d+(zz[i-1]->get_wz()-zz[i]->get_wz());
if(d>255) d-=256;
}
if(zz[i]->get_wz()>zz[i-1]->get_wz())
{
d=d-(zz[i]->get_wz()-zz[i-1]->get_wz());
if(d<0) d+=256;
}
d=zz[i-1]->get_L_R((char)d);
}
d=d-zz[0]->get_wz();
if(d<0) d+=256;
//轉(zhuǎn)子轉(zhuǎn)動(dòng)處理
for(i=0;i<30;i++)
{
zz[i]->go();
}
return (char)d;
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1