標(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++源程序

  1. //加密機(jī)轉(zhuǎn)子類
  2. class egm_zz
  3.     {
  4.         public:
  5.             //公共的行為或?qū)傩?br />
  6.                         egm_zz(char *r,char *l);//構(gòu)造函數(shù)(參數(shù)為接線盤排列信息)
  7.             void set_wz(char key);//設(shè)置密鑰(轉(zhuǎn)子初始位置)
  8.                         void set_guize(int gz);//設(shè)置轉(zhuǎn)動(dòng)規(guī)則(加密多少字節(jié)轉(zhuǎn)動(dòng)一次轉(zhuǎn)子)
  9.                         char get_wz();//返回轉(zhuǎn)子位置
  10.             char get_R_L(char data);//從右往左進(jìn)行一次替換
  11.                         char get_L_R(char data);//從左往右進(jìn)行一次替換
  12.                         void go();//轉(zhuǎn)子進(jìn)行一次轉(zhuǎn)動(dòng)判定

  13.         private:
  14.             //私有的行為或?qū)傩?br />
  15.                         char R[256];//轉(zhuǎn)子右接線盤
  16.                         char L[256];//轉(zhuǎn)子左接線盤
  17.                         char  wz;//轉(zhuǎn)子位置
  18.                         int  guize;//轉(zhuǎn)子轉(zhuǎn)動(dòng)規(guī)則
  19.                         int  guize_A;//轉(zhuǎn)動(dòng)數(shù)據(jù)累加器
  20.     };

  21. //加密機(jī)反射板類
  22. class egm_fs
  23. {
  24.   public:
  25.             //公共的行為或?qū)傩?br />
  26.          egm_fs(char *r,char *l);//構(gòu)造反射板
  27.          char get_fs(char data);//進(jìn)行一次數(shù)據(jù)替換
  28.   private:
  29.             //私有的行為或?qū)傩?br />
  30.          char R[128];//反射板接線盤共128對(duì)接線分別對(duì)應(yīng)0x00~0xFF
  31.          char L[128];
  32. };


  33. //定義30轉(zhuǎn)子的恩格瑪機(jī)
  34. class egm_30
  35.   {
  36.         public:
  37.             //公共的行為或?qū)傩?br />
  38.                 egm_30();//構(gòu)造函數(shù)
  39.                 void set_key_wz(char *key);//設(shè)置密鑰串的轉(zhuǎn)子位置部分(30個(gè))
  40.                 void set_key_guize(int *key);//設(shè)置密鑰串的轉(zhuǎn)子轉(zhuǎn)動(dòng)規(guī)則部分(30個(gè))
  41.                 char jiami(char data);//對(duì)一個(gè)字節(jié)進(jìn)行加密

  42.         private:
  43.             //私有的行為或?qū)傩?br />
  44.                 egm_zz *zz[30];//30個(gè)轉(zhuǎn)子對(duì)象
  45.                 egm_fs *fs;//1個(gè)反射板對(duì)象

  46.   };

  47. //對(duì)一個(gè)字節(jié)進(jìn)行加密(核心算法)
  48. char egm_30::jiami(char data)
  49. {  
  50.    int i;
  51.    int d;
  52.    d=data;
  53.    d=d+zz[0]->get_wz();
  54.    if(d>255) d-=256; //修正并定位轉(zhuǎn)動(dòng)后的0號(hào)轉(zhuǎn)子的觸點(diǎn)位置
  55.    d=zz[0]->get_R_L((char)d);
  56.    
  57.   
  58.    //1號(hào)到29號(hào)轉(zhuǎn)子從右往左處理一輪
  59.    for(i=0;i<29;i++)
  60.    {
  61.           if(zz[i]->get_wz()<zz[i+1]->get_wz())
  62.           {
  63.                   d=d+(zz[i+1]->get_wz()-zz[i]->get_wz());
  64.            if(d>255) d-=256;
  65.           }
  66.        if(zz[i]->get_wz()>zz[i+1]->get_wz())
  67.           {
  68.            d=d-(zz[i]->get_wz()-zz[i+1]->get_wz());
  69.                   if(d<0) d+=256;
  70.           }
  71.           d=zz[i+1]->get_R_L((char)d);
  72.    }
  73.    //反射板處理一次數(shù)據(jù)
  74.    d=d-zz[29]->get_wz();
  75.    if(d<0) d+=256;
  76.    d=fs->get_fs((char)d);
  77.    //29號(hào)轉(zhuǎn)子左到右處理
  78.    d=d+zz[29]->get_wz();
  79.    if(d>255) d-=256;
  80.    d=zz[29]->get_L_R((char)d);
  81.     //28號(hào)到0號(hào)轉(zhuǎn)子從左往右處理一輪
  82.    for(i=29;i>0;i--)
  83.    {
  84.           if(zz[i]->get_wz()<zz[i-1]->get_wz())
  85.           {
  86.            d=d+(zz[i-1]->get_wz()-zz[i]->get_wz());
  87.            if(d>255) d-=256;
  88.           }
  89.           if(zz[i]->get_wz()>zz[i-1]->get_wz())
  90.           {
  91.             d=d-(zz[i]->get_wz()-zz[i-1]->get_wz());
  92.                         if(d<0) d+=256;
  93.           }
  94.        d=zz[i-1]->get_L_R((char)d);
  95.    }
  96.    d=d-zz[0]->get_wz();
  97.    if(d<0) d+=256;
  98.    //轉(zhuǎn)子轉(zhuǎn)動(dòng)處理
  99.    for(i=0;i<30;i++)
  100.    {
  101.           zz[i]->go();
  102.    }
  103.         return (char)d;
  104. }
復(fù)制代碼










歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1