1实验报告课程名称物联网信息安全题目名称物联网信息安全实验学生学院自动化学院专业班级物联网工程*班学号**********学生姓名******指导教师曾****2017年07月01日23实验一物联网实验箱基本使用一、实验目的掌握ZXBee物联网开发套件的使用。二、实验环境硬件:ZXBeeCC2530节点板2块、USB接口的CC2530仿真器,PC机;软件:Windows7/WindowsXP、IAR集成开发环境、串口监控程序。三、实验内容以下内容均使用《基于CC2530Zigbee无线传感网协议开发》一书作为实验指导书,以后简称《指导书》。其中的代码不提供copy,请同学们自己输入。1)自行阅读《指导书》第1章有关ZXBee开发环境的介绍,并完成1.5“创建第一个IAR应用程序”。2)完成第2章基本接口实验:2.2“LED控制实验”和2.5“串口实验”。3)完成第4章无线射频实验:4.1“点对点通信实验”、4.2“广播通信实验”和4.4“信道监听实验”。四、实验结果2.2“LED控制实验”结果图如下:2.5“串口实验”结果图如下:44.1“点对点通信实验”结果图如下:发送节点将数据发送出去后,接收节点接收到数据,并通过串口调试助手打印输出。发送数据的最大长度为125(加上发送的数据长度和校验,实际发送的数据长度为128字节)。4.4“信道监听实验”结果图如下:使用了信道12:5使用了信道20:五、实验总结通过本次实验,我掌握了ZXBee物联网开发套件的使用,成功创建了第一个IAR应用程序,并且依据《指导书》成功完成了LED控制实验、串口实验、点对点通信实验、广播通信实验和信道监听实验等基础实验。为后续实验奠定了基础。6实验二常规加密算法实验一、实验目的掌握常规加密算法中替换算法的原理。二、实验环境硬件:ZXBeeCC2530节点板2块、USB接口的CC2530仿真器,PC机;软件:Windows7/WindowsXP、IAR集成开发环境、串口监控程序。三、实验原理假设所有发送及接收节点均工作在同一信号,很明显,如果发送的数据是明文的话,则每个节点均可监听到其他节点发送的数据。若不希望信息被未经授权的节点所监听,可采用加密算法实现保密性。四、实验内容1)本实验程序可在《指导书》4.4节程序上进行修改,可节约时间。信道编号不用更改。2)增加一个替换密码表产生函数KeyGenerator()。/*密码表产生函数*/voidKeyGenerator(uint8*Key,unsignedintseed){inti,j,k;chart;for(i=0;i26;i++)Key[i]=97+i;//密码表初始化for(k=0;k100;k++){j=seed%26;i=k%26;//得到交换顺序t=Key[j];Key[j]=Key[i];Key[i]=t;//交换字母seed=seed*(seed+7)-13;//随机发生器}}3)增加一个加密函数Encrytion()。仅对明文中小写英文字母进行加密,其他字符不变。/*加密函数*/voidEncrytion(uint8*PlainText,uint8*CipherText,uint8*Key,intTextLen){7inti;for(i=0;iTextLen;i++){if(PlainText[i]=97&&PlainText[i]=122)CipherText[i]=Key[PlainText[i]-97];elseCipherText[i]=PlainText[i];}}4)增加一个发送数据函数rfSendData()。发送节点每隔1s发送一次数据/*发送数据函数*/voidrfSendData(void){uint8PlainText[]={'h','e','l','l','o','1','5','\r','\n'};//待发送的数据inti;uint8Key[26];//密码表uint8CipherText[sizeofPlainText];KeyGenerator(Key,12);//12为种子,可随意更改Encrytion(PlainText,CipherText,Key,sizeofPlainText);//加密产生密文while(TRUE){basicRfSendPacket(RECV_ADDR,PlainText,sizeofPlainText);//发送数据halMcuWaitMs(1000);}}上面的PlainText[]数组中第6、7字节改为各实验小组的组号。KeyGenerator(Key,12);中的12为种子值,各实验小组可随意更改。5)修改接收数据函数rfRecvData()。接收节点不断接收各个发送节点发送的信息,并通过串口显示。/*接收数据函数*/voidrfRecvData(void){uint8pRxData[128];//用来存放接收到的数据intrlen;basicRfReceiveOn();//打开接收器while(TRUE){while(!basicRfPacketIsReady());//等待直到数据准备好rlen=basicRfReceive(pRxData,sizeofpRxData,NULL);//接收数据8if(rlen0){//接收到数据printf(pRxData);}}}6)修改主函数main()。将main()中的如下语句部分修改。#ifNODE_TYPErfSendData();//发送数据#elserfRecvData();//接收数据#endif五、实验步骤1)将工程文件main.c中的节点类型变量NODE_TYPE的值设置为1,选择Project-RebuildAll重新编译工程;将CC2530仿真器连接到第1个CC2530节点板,上电CC2530节点板,然后点击菜单Project-Downloadanddebug下载程序到此节点板。此节点以下称为发送节点。2)将工程文件main.c中节点类型变量NODE_TYPE第值设置为0,选择Project-RebuildAll重新编译工程。将CC2530仿真器连接到第2个CC2530节点板,上电CC2530节点板,然后点击菜单Project-Downloadanddebug下载程序到此节点板。此节点以下称为接收节点。3)将发送节点,上电并复位。4)将接收节点通过串口线连接到PC上,打开串口调试助手,配置串口助手波特率为19200。上电并复位接收节点,可看到串口上打印出信道监听接收到的数据。这时候数据应该是明文。5)修改发送函数rfSendData()。将basicRfSendPacket(RECV_ADDR,PlainText,sizeofPlainText);更改为basicRfSendPacket(RECV_ADDR,CipherText,sizeofCipherText);6)重复上面第1步,更新发送节点程序。7)将发送节点上电并复位。8)将串口移至接收节点。上电并复位接收节点,注意观察串口上打印的结果。9)自己编写一个解密函数voidDecrytion(uint8*CipherText,uint8*PlainText,uint8*Key,intTextLen);10)更改接收数据函数rfRecvData()。对每次接收到的信息,先进行解密,再通过串口打印。9(注意:解密时所用的密码表必须与加密时所用的密码表相同才能正确解密。决定密码表的因素为seed值。)六、实验结果实验的结果注意观察三种情况并对比。1)发送数据均采用明文。2)发送数据采用密文,但接收数据没有解密。3)发送数据采用密文,接收数据后解密。结果图1——自己编写的解密函数:结果图2——改写的接收数据函数rfRecvData():10结果图3——发送数据均采用明文:结果图4——发送数据采用密文,但接收数据没有解密:结果图5——发送数据采用密文,接收数据后解密:11七、实验总结经过本次实验,我掌握了常规加密算法中替换算法的原理,能够自己完成编写解密函数和相应地修改接收函数,更深刻理解了加密算法和解密算法的运作。此外,在发送明文时要注意在发送的数据末尾加上结束符'\0',否则会出现乱码情况。实验三消息认证实验一、实验目的掌握消息摘要Hash算法的原理。掌握消息认证的方法。二、实验环境硬件:ZXBeeCC2530节点板2块、USB接口的CC2530仿真器,PC机;软件:Windows7/WindowsXP、IAR集成开发环境、串口监控程序。三、实验原理假设所有发送及接收节点均工作在同一信号,每个节点均可监听到其他节点发送的数据。如何确信消息是来源声称的身份所发送的?同时,如何确保消息在传输过程中没有收12到篡改?解决方法是采用消息认证机制。四、实验步骤1)本实验程序可在《指导书》4.4节程序上进行修改,可节约时间。信道编号不用更改。2)增加下列三个函数和有关定义。#defineMD_LEN5//消息摘要长度,字节(40bit)//简化版的消息摘要,长度为5字节#defineBLOCK_SIZE16//Hash处理的块长度,字节(128bit)//简化版的SHA处理数据块大小,长度为16字节//字节循环左移函数uint8crol(uint8c,uint8b){uint8left=cb;uint8right=c(8-b);uint8temp=left|right;returntemp;}//简化版的SHA函数voidHashTransfer(uint8*yText,uint8*MD){uint8A=MD[0],B=MD[1],C=MD[2],D=MD[3],E=MD[4];uint8TA,TB,TC,TD;inti;for(i=0;i20;i++)//只做20步,用一个逻辑函数{TA=A;TB=B;TC=C;TD=D;A=crol(A,3)+(B&C)|(~B&D)+E+yText[i%MD_LEN];B=TA;C=crol(TB,6);D=TC;E=TD;}MD[0]=MD[0]^A;MD[1]=MD[1]^B;MD[2]=MD[2]^C;MD[3]=MD[3]^D;MD[4]=MD[4]^E;}//消息摘要函数voidHash(uint8*Text,uint8*MD,intTextLen)13{inti;intleftLen=TextLen;uint8yText[BLOCK_SIZE];uint8IV[MD_LEN]={'\x67','\xEF','\x98','\x10','\xC3'};memcpy(MD,IV,MD_LEN);//初始化MD//简化版的分块,不足一个分块大小的后面补0for(i=0;i(TextLen/BLOCK_SIZE+1);i++){if(leftLen/BLOCK_SIZE!=0){memcpy(yText,Text+i*BLOCK_SIZE,BLOCK_SIZE);}else{memcpy(yText,Text+i*BLOCK_SIZE,leftLen);memset(yText+leftLen,0,BLOCK_SIZE-leftLen);}//简化版SHA转换HashTransfer(yText,MD);leftLen=leftLen-BLOCK_SIZE;}}3)增加一个发送数据函数rfSendData()。发送节点每隔1s发送一次数据。发送数据的格式为:字段名称消息内容长度消息内容HMAC长度(字节)12~2565代码:/*发送数据函数*/voidrfSendData(void){uint8PlainText[]={No.15:GuangdongUniversityofTechnology.\n};//待发送的数据uint8MD[MD_LEN];uint8pTxData[128];//用来存放发送数据Hash(PlainText,MD,sizeofPlainText);//产生消息摘要pTxData[0]=sizeofPla