实验二 常规加密算法实验
一、实验目的
掌握常规加密算法中替换算法的原理。 二、实验环境
硬件:ZXBee CC2530 节点板 2 块、USB 接口的 CC2530 仿真器,PC 机; 软件:Windows 7/Windows XP、IAR 集成开发环境、串口监控程序。 三、实验原理
假设所有发送及接收节点均工作在同一信号,很明显,如果发送的数据是明文的话,则每个节点均可监听到其他节点发送的数据。若不希望信息被未经授权的节点所监听,可采用加密算法实现保密性。 四、实验内容
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&; i=k&; //得到交换顺序 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) {
6
} int i; for(i=0;i
/*发送数据函数 */ 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); //接收数据
7
} } if(rlen > 0) { //接收到数据 printf(pRxData); } 6)修改主函数main()。将main()中的如下语句部分修改。
#if NODE_TYPE rfSendData(); //发送数据 #else rfRecvData(); //接收数据 #endif 五、实验步骤
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()。对每次接收到的信息,先进行解密,再通过串口打印。
8
(注意:解密时所用的密码表必须与加密时所用的密码表相同才能正确解密。决定密码表的因素为seed值。) 六、实验结果
实验的结果注意观察三种情况并对比。
1)发送数据均采用明文。
2)发送数据采用密文,但接收数据没有解密。 3)发送数据采用密文,接收数据后解密。 结果图1——自己编写的解密函数:
结果图2——改写的接收数据函数rfRecvData():
9
结果图3——发送数据均采用明文:
结果图4——发送数据采用密文,但接收数据没有解密:
结果图5——发送数据采用密文,接收数据后解密:
10