IOT安全技术综合实验报告1.docx
《IOT安全技术综合实验报告1.docx》由会员分享,可在线阅读,更多相关《IOT安全技术综合实验报告1.docx(12页珍藏版)》请在冰豆网上搜索。
IOT安全技术综合实验报告1
IOT安全技术综合实验报告
班级:
物联网18-
(1)班
学号:
**********
姓名:
*****
物联网安全技术综合实验报告
一、实验内容
对各种传感器采集到的数据提取出来(2种以上类型数据),进行加密和认证操作,编写网络传输程序,在发送端将加密和认证后的数据发出,在接收端对接收到的数据验证和解密,提取出原始的传感器数据。
加密算法和认证算法需要自己编写程序,不得使用网上现有的加密工具,必须有可运行的源代码,可采用DES、AES、RC4等对称加密算法对数据进行加密,采用RSA等公钥密码对数据加密密钥进行加密,采用消息认证码或数字签名机制对数据进行认证。
二、采集数据
1、硬件设备
1)传感器的作用。
本次实现中,硬件的功能为采集传感器的数,然后通过串口传输到电脑端的串口助手中,再通过串口助手的存储数据功能,实现把传感器数据存储到一个txt类型的文档中。
硬件模块包括光强传感器和主控CC2530单片机。
2)光敏传感器通过iic的通信协议,与cc2530单片机进行通信。
光强传感器使用的是BH1750,硬件系统结构图1所示。
图1
3)硬件电路设计。
BH1750传感器采用IIC总线,其中SCL连接到CC2530单片机的P0_0端口,SDA连接CC2530单片机的P0_1端口。
图2
2、实验步骤
1)首先按照原理图,进行实物图的连接,连接效果如图3,采集模块的六号框为光强传感器。
图3
2)在win10环境下,利用IARFor8051编写程序(图4),程序的功能为:
读取湿度传感器的值,并通过串口发送出去,串口波特率为38400。
图4
3)通过SmartRF04仿真器连接cc2530和电脑,并利用FlashPromgrammer工具,把程序烧录到单片机中,接着开启串口助手,配置好波特率后即可看到这样的数据“light=124.0”。
4)对数据进行记录存储后,得到我们想要的数据文件,文件类型为txt文档。
文档的部分内容如图5所示。
图5
3、主要代码及注释
1)本次硬件代码的步骤为,通过iic获取传感器的值,然后通过串口上传,稍作延时后,进行第二次循环。
2)核心部分代码一,上传光强值。
//获取传感器的值
p=bh1750_get_data();
//将光强值写入到要发送的数组中
sprintf(p,"%.1f",light);
//通过串口上报光强值
ZXBeeAdd("light",p);
3)核心部分代码二,获取传感器值:
floatbh1750_get_data(void)//返回值为传感器的光强值。
{
uchar*p=buf;
bh1750_init();//初始化BH1750
bh1750_send_byte(0x46,0x01);//poweron
bh1750_send_byte(0x46,0X20);//H-resolutionmode
delay_ms(180);//延时180ms
bh1750_read_nbyte(0x46,p,2);//连续读出数据,存储在BUF中
unsignedshortx=buf[0]<<8|buf[1];
returnx/1.2;}
三、加密解密算法
1、基本原理
1)数据整体原理。
本次的加密解密在电脑端模拟完成,共分为两个程序,分别为客户端程序和服务器端程序,客户端程序负责,向服务器端程序传输,对明文处理后的数据,服务器端负责接收客户端发送过来的数据,并对数据进行验证及解密分析。
2)整体算法流程图:
图6
3)本次用来对秘钥进行加解密算法有:
RSA,首先是在客户端tcp连接服务器后,通过RSA算法,利用服务器B的公钥进行加密RC4的秘钥,发送给B,然后B采用自己的私钥进行解密,得到秘钥K。
4)本次对明文的加密方式采用的是:
RC4,在传输完秘钥后,客户端程序先读取一行数据文件的传感器数据,并通过RC4的加密方式,利用秘钥K进行数据加密,生产密文m1。
2、主要代码及注释
1)加密及发送秘钥的核心代码:
for(i=0;imingwen[i]=key[i];
encrypt(Be,Bn);//rsa通过B的公钥加密,加密mingwen[]数组中的数据,结果存于c[]数组中。
printf("对加密的结果为:
");
for(i=0;i{
sendBuf[i]=c[i];
printf("%d",c[i]);
}
printf("\n");
tcp_send();//发送秘钥
3)读取一行文档数据的核心代码:
file_open();//开启文件
while(fgets(str,N,fp)!
=NULL){
printf("传感器的数据为:
",);
printf("%s\n",str);
4)对数据进行RC4加密的核心代码:
//RC4加密,加密后的数据在pData中
rc4_crypt(s,(unsignedchar*)pData,cdi);
printf("\n进行RC4加密得到的结果为:
");
for(i=0;iencrypts[i]=pData[i];//放于MD5的加密数组中
printf("%d",pData[i]);
}
printf("\n");
2、执行界面
图7
四、消息认证(签名)
1、消息保护的原理:
1)消息完整性的验证,对RC4加密后的密文进行MD5运算,得到128位散列值,接收方解密得到散列值后,再对收到的RC4加密后的密文进行一次MD5运算,如果两处计算得到的散列值都一样,则说明,消息没有被篡改,可以进行下一步使用。
2)来源的认证,采用的实现算法是RSA,客户端利用自己的私钥进行加密报文,然后发给服务器端,服务器端利用客户端的公钥进行解密认证。
其数字签名的内容为:
RC4加密后的密文与MD5加密后的密文。
3、核心代码
1)MD5加密的使用核心代码:
printf("MD5加密前的数据为:
");
for(i=0;iprintf("%d",encrypts[i]);
}
printf("\n");
MD5Update(&md5,encrypts,strlen((char*)encrypts));
MD5Final(&md5,decrypts);
printf("MD5加密后:
");
for(i=0;i<16;i++)
{
printf("%d",decrypts[i]);
}
3)利用RSA进行数字签名的核心代码:
//RSA加密,身份认证,encrypt(e,n)把全局定义的mingwen[256]进行加密,结果存于c[256]
for(i=0;i<16+strlen(str);i++){
mingwen[i]=M2[i];
printf("%d",mingwen[i]);
}
encrypt(Ad,An);//rsa通过A的私钥加密
4、实现界面:
1)发送端界面:
图8
2)接收端界面:
图9
五、网络传输
1、实现原理:
1)本次采用的是网络传输方式是tcp协议,通过在电脑端开启两个程序,一个作为tcp服务器一个作为客户端进行tcp连接,进而实现数据的交互。
2)由于本次进行tcp发送的值为RSA签名加密的结果,且本程序的RSA算法的结果为unsignedint型数组,因为其值可能出现大于256,但是网络传输的tcp协议,一次报文传输的数据为unsignedchar型,出现了数据丢失现象,故需要把RSA计算的结果进行拆分,如一个unsignedint型数据拆分成为两个unsignedchar型数据,然后再通过tcp发送过去,接收方收到数据后,再按照规律两个数据组合成为一个数据。
拆分如下图。
图10
5、核心代码:
1)数组的拆分核心代码:
unsignedcharchang[2];
//把参数分解成为两个char的数据并存于chang[2]中,高位在前,低位在后。
voidi_2c(unsignedintnum){
//高位在前,低位在后
unsignedintnum2;
chang[1]=num%256;//取后面的值
num2=num/256;
chang[0]=num2%256;//取前面的值
}
2)数组的合并的核心代码:
//对chang中的数据进行结合,把结果返回
unsignedinttc_i(){
//高位在前,低位在后
unsignedintval=1;
val*=chang[1];//取后面的值
val+=chang[0]*256;//取前面的值
returnval;
}
3)tcp连接的核心代码
sockClient=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(addrServer));
六、总结与收获
在本次实训中,我更加熟练了各种加解密算法的运用,及其优缺点,也更加理会到了其中的组合逻辑,层层嵌套,层层相互作用及其验证,如今物联网行业发展迅速,其数据的安全性更是不容小视,在本次实验中,我学会了物联网数据结合加解密算法的处理。
本次实验中,令我印象最深刻的问题是RSA签名中加密后数据的大小问题,在程序执行的最后一步,把需要传输的数据写入到tcp传输的数组里后,出现了数据丢失,且在之前的秘钥传输过程中,秘钥的值比较小,没有出现加密结果单个数大于256,即出现了加解密成功。
这导致了问题更加难发现,在最后把数据都打印出来后,发现接收到的数据和发送的数据不一致,出现了丢失,如:
传输1520,则只传输出去的值为240。
最终发现是tcp传输的数组为unsignedchar类型的,最大值是256,但已经到程序的最后一步了,如果修改别的验证方法工作量会非常大,故采用了分割发进行解决,如:
把待传输的200个unsignedint型数组转化成为400个unsignedchar型数组进行发送,接收到后再重新恢复为200个unsignedint型数组。
所幸的是问题得到了解决。