找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3101|回复: 0
打印 上一主题 下一主题
收起左侧

30转子恩格玛机对文件进行加密C++源程序

[复制链接]
跳转到指定楼层
楼主
ID:102014 发表于 2016-1-6 01:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. //加密机转子类
  2. class egm_zz
  3.     {
  4.         public:
  5.             //公共的行为或属性
  6.                         egm_zz(char *r,char *l);//构造函数(参数为接线盘排列信息)
  7.             void set_wz(char key);//设置密钥(转子初始位置)
  8.                         void set_guize(int gz);//设置转动规则(加密多少字节转动一次转子)
  9.                         char get_wz();//返回转子位置
  10.             char get_R_L(char data);//从右往左进行一次替换
  11.                         char get_L_R(char data);//从左往右进行一次替换
  12.                         void go();//转子进行一次转动判定

  13.         private:
  14.             //私有的行为或属性
  15.                         char R[256];//转子右接线盘
  16.                         char L[256];//转子左接线盘
  17.                         char  wz;//转子位置
  18.                         int  guize;//转子转动规则
  19.                         int  guize_A;//转动数据累加器
  20.     };

  21. //加密机反射板类
  22. class egm_fs
  23. {
  24.   public:
  25.             //公共的行为或属性
  26.          egm_fs(char *r,char *l);//构造反射板
  27.          char get_fs(char data);//进行一次数据替换
  28.   private:
  29.             //私有的行为或属性
  30.          char R[128];//反射板接线盘共128对接线分别对应0x00~0xFF
  31.          char L[128];
  32. };


  33. //定义30转子的恩格玛机
  34. class egm_30
  35.   {
  36.         public:
  37.             //公共的行为或属性
  38.                 egm_30();//构造函数
  39.                 void set_key_wz(char *key);//设置密钥串的转子位置部分(30个)
  40.                 void set_key_guize(int *key);//设置密钥串的转子转动规则部分(30个)
  41.                 char jiami(char data);//对一个字节进行加密

  42.         private:
  43.             //私有的行为或属性
  44.                 egm_zz *zz[30];//30个转子对象
  45.                 egm_fs *fs;//1个反射板对象

  46.   };

  47. //对一个字节进行加密(核心算法)
  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; //修正并定位转动后的0号转子的触点位置
  55.    d=zz[0]->get_R_L((char)d);
  56.    
  57.   
  58.    //1号到29号转子从右往左处理一轮
  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.    //反射板处理一次数据
  74.    d=d-zz[29]->get_wz();
  75.    if(d<0) d+=256;
  76.    d=fs->get_fs((char)d);
  77.    //29号转子左到右处理
  78.    d=d+zz[29]->get_wz();
  79.    if(d>255) d-=256;
  80.    d=zz[29]->get_L_R((char)d);
  81.     //28号到0号转子从左往右处理一轮
  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.    //转子转动处理
  99.    for(i=0;i<30;i++)
  100.    {
  101.           zz[i]->go();
  102.    }
  103.         return (char)d;
  104. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表