《信息安全技术》实验报告

 

实验二 简单常规加密算法实验

 

1、实验目的

  掌握常规加密算法中替换算法的原理。

 

2、实验环境

  硬件:ZXBee CC2530 节点板 2 块、USB  接口的 CC2530 仿真器,PC 机;

  软件:Windows 7/Windows XP、IAR 集成开发环境、串口监控程序。

 

3、实验原理

       假设所有发送及接收节点均工作在同一信号,很明显,如果发送的数据是明文的话,则每个节点均可监听到其他节点发送的数据。若不希望信息被未经授权的节点所监听,可采用加密算法实现保密性。

 

4、实验内容

       1)本实验程序可在《指导书》4.4节程序上进行修改,可节约时间。信道编号不用更改。

       2)增加一个替换密码表产生函数KeyGenerator()。

/* 密码表产生函数 */

void KeyGenerator(uint8 *Key, unsigned int seed)

{

       int i,j,k;

       char t;

 

       for(i=0;i<26;i++) Key[i]=97+i;    //密码表初始化

 

       for(k=0;k<100;k++)

       {

              j=seed%26;

              i=k%26;                //得到交换顺序

 

              t=Key[j];

              Key[j]=Key[i];

              Key[i]=t;           //交换字母

 

              seed=seed*(seed+7)-13;           //随机发生器

       }

}

 

       3)增加一个加密函数Encrytion()。仅对明文中小写英文字母进行加密,其他字符不变。

/* 加密函数 */

void Encrytion(uint8 *PlainText, uint8 *CipherText, uint8 *Key, int TextLen)

{

       int i;

       for(i=0;i<TextLen;i++)

       {

              if(PlainText[i]>=97 && PlainText[i]<=122)

                     CipherText[i]=Key[PlainText[i]-97];

              else

                     CipherText[i]=PlainText[i];

       }

}

 

       4)增加一个发送数据函数rfSendData()。发送节点每隔 1s发送一次数据

/*发送数据函数 */

void rfSendData(void)

{

       uint8 PlainText[] = {'h', 'e', 'l', 'l', 'o', '1', '5', '\r', '\n'};   // 待发送的数据

       int i;

       uint8 Key[26];       //密码表

       uint8 CipherText[sizeof PlainText];

 

       KeyGenerator(Key, 12);        //12为种子,可随意更改

Encrytion(PlainText, CipherText, Key, sizeof PlainText);      //加密产生密文

 

       while(TRUE){

              basicRfSendPacket(RECV_ADDR, PlainText, sizeof PlainText);      //发送数据

              halMcuWaitMs(1000);

       }

}

       上面的PlainText[]数组中第6、7字节改为各实验小组的组号。KeyGenerator(Key, 12);中的12为种子值,各实验小组可随意更改。

 

       5)修改接收数据函数rfRecvData()。接收节点不断接收各个发送节点发送的信息,并通过串口显示。

/*  接收数据函数  */

void rfRecvData(void)

{

       uint8 pRxData[128];      //用来存放接收到的数据

       int rlen;

       basicRfReceiveOn();      //打开接收器

 

       while (TRUE) {

              while(!basicRfPacketIsReady());    //等待直到数据准备好

              rlen = basicRfReceive(pRxData, sizeof pRxData, NULL);    //接收数据

              if(rlen > 0) {    //接收到数据

                     printf(pRxData);

              }

       }

}

 

       6)修改主函数main()。将main()中的如下语句部分修改。

#if NODE_TYPE

rfSendData();    //发送数据

#else

rfRecvData();    //接收数据

#endif

 

5、实验步骤

       1)将工程文件 main.c 中的节点类型变量 NODE_TYPE 的值设置为 1,选择 Project->Rebuild All 重新编译工程;将 CC2530 仿真器连接到第 1 个 CC2530 节点板,上电 CC2530 节点板,然后点击菜单Project->Download and debug 下载程序到此节点板。此节点以下称为发送节点。

       2)将工程文件 main.c 中节点类型变量 NODE_TYPE 第值设置为 0,选择 Project->Rebuild All重新编译工程。将 CC2530 仿真器连接到第 2 个 CC2530 节点板,上电 CC2530 节点板,然后点击菜单Project->Download and debug 下载程序到此节点板。此节点以下称为接收节点。

       3)将发送节点,上电并复位。

       4)将接收节点通过串口线连接到  PC 上,打开串口调试助手,配置串口助手波特率为 19200。上电并复位接收节点,可看到串口上打印出信道监听接收到的数据。这时候数据应该是明文。

 

       5)修改发送函数rfSendData()。

       将basicRfSendPacket(RECV_ADDR, PlainText, sizeof PlainText); 

       更改为basicRfSendPacket(RECV_ADDR, CipherText, sizeof CipherText);

       6)重复上面第1步,更新发送节点程序。

       7)将发送节点上电并复位。

       8)将串口移至接收节点。上电并复位接收节点,注意观察串口上打印的结果。

 

       9)自己编写一个解密函数

       void Decrytion(uint8 *CipherText, uint8 *PlainText, uint8 *Key, int TextLen);

      

       10)更改接收数据函数rfRecvData()。对每次接收到的信息,先进行解密,再通过串口打印。(注意:解密时所用的密码表必须与加密时所用的密码表相同才能正确解密。决定密码表的因素为seed值。)

       提示:解密所用的密码表Key应该在什么时候产生?将KeyGenerator()放在rfRecvData()里面是否合适?不合适的话,如何改善?

 

6、实验结果

       实验的结果注意观察三种情况并对比。

1) 发送数据均采用明文。

 

2) 发送数据采用密文,但接收数据没有解密。

3) 发送数据采用密文,接收数据后解密。

 

 

7、思考题

以上的实验仅使用了替换算法,请同学们尝试编写使用移位算法的加/解密函数,并且用文字或图形说明你设计的算法过程。(完成本思考题的同学可获得加分)

定义一个长度n,可以直接定义也可以由用户输入,该数字至少要比用户输入的字符串的长度c_len小,int g_len=c_len%n然后将输入的字符串分解成一个二维的数组 plaintext[g_len][n],最后一行用空格补齐,然后该数组从上往下,一列一列地读出来形成密文。解密则将密文从二维数组ciphertext[n][g_len]按列从上往下读取出即可。

posted on 2021-06-30 11:06  翎凌零  阅读(357)  评论(0)    收藏  举报