《信息安全技术》实验报告
实验二 简单常规加密算法实验
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]按列从上往下读取出即可。
浙公网安备 33010602011771号