当前位置:
文档之家› 实验报告2---古典密码playfair
实验报告2---古典密码playfair
陕西师范大学数学与信息科学学院
信息安全实验报告
学号********姓名程晓红班级09信科时间2012-5-5成绩_______
实验名称
古典密码算法-2
实验目的
通过编程实现Playfair密码算法,进一步加深对古典密码体制的了解,为深入学习密码学奠定基础。
实验原理
Playfair密码基于一个5*5字母矩阵,该矩阵使用一个关键词(密钥)来构造,其构造方法是:从左至右、从上至下依次填入关键词的字母(去除重复的字母),然后再以字母表顺序依次填入其他字母。字母I和J被算为一个字母(即J被当做I处理)。
请输出扩展的明文:
effecttreqecorrectappleq
请按分组输出明文:
ef fe ct tr eq ec or re ct ap pl eq
请输出密文:
fnnfhoodiucivgfchobibsiu
请按分组输出明文:
fn nf ho od iu ci vg fc ho bi bs iu
2)母在密钥中的顺序。
3)其次将其他字母按顺序进行输入,注意不能重复在密钥部分中存在的字母。
4)其中在前两部都需进行重复删除操作:
for(j=0;j<i;j++)
if(key[i]==key[j]) break;
5)将密钥钥数组转化为二维数组(利用循环嵌套),并进行输出。
要求:上述密码算法的实现程序提供加密接口encrypt( ),程序名为playfair.c
实
验
过
程
1、对playfair体制进行算法分析,需要构造密钥矩阵,且需对明文进行分组处理,然后按照法则进行加密。
2、构造密钥矩阵注意事项以及实现步骤:
1)密钥矩阵是一个5*5矩阵,其中字母“j”看做是“i”。且密钥矩阵是分为两部分:密钥部分,以及其他字母部分。为了方便起见,先将密钥矩阵按照一维数组进行处理,在矩阵元素完全确定后将一维数组转化为二维数组。
Press any key to continue
实验
心得
在经过第一次编程,这一次明显比上次容易上手,对程序的总体布局有了更清晰的分析,使得在编程的时候,按部就班,使得程序的结构较为清晰。而且这次在处理数据的时候,该注意的地方,都有特别留意,使得没有在处理低级错误浪费时间。越来越觉得编程的逻辑性就决定了这个程序所需要花费的时间以及准确度,所以在以后编程的时候,要继续加强编程逻辑的培养,这样编程就会越来越好的啊!
cipher[k+1]=key1[p2][q1];}
3)分组输出密文,注意密文的结束符“\0”.
实验
结果
请输入密钥:
cipher
请输出密钥矩阵:
c i p h e
r a b d f
g k l m n
o q s t u
v w x y z
请输入明文:
effecttreecorrectapple
effecttreecorrectapple
if(p2==4) p2=-1;
cipher[k]=key1[p1+1][q1];
cipher[k+1]=key1[p2+1][q2];}
ⅲ、同一分组既不在同行也不在同列,以其作为矩形两个对角顶点,其他两点即为所得密文,其中c1与m1同行,c2与m2同行:
if(p1!=p2&&q1!=q2)
{cipher[k]=key1[p1][q2];
{if(q1==4) q1=-1;
if(q2==4) q2=-1;
cipher[k]=key1[p1][q1+1];
cipher[k+1]=key1[p1][q2+1];}
ⅱ、同一分组在同一列,密文为所在行紧靠明文下方的字母,其中注意第一行看做是最后一行的下方:
if(q1==q2)
{if(p1==4) p1=-1;
④若M1M2,则插入一个字母(如约定为Q)于重复字母之间,并用前述方法处理。
⑤若明文字母数为奇数时,则在明文的末端添加某个事先约定的字母作为填充。
实验环境
运行Windows操作系统的PC机,具有VC++ 6.0或Turbo C语言编译环境
实验内容
根据实验原理部分对Playfair密码算法的介绍,自己创建明文信息,并选择一个密钥,编写Playfair密码算法的加密操作。
{for(j=n1;j>=i+1;j--)
plain[j+1]=plain[j];
plain[i+1]='q';
n1++;}
其二,若字符串为奇数位,在串尾添加“q”,使得明文字母串为偶数位。
if(n1%2==1)
{plain[n1]='q';
plain[++n1]='\0';}
3)将扩展后的明文按分组进行输出(即为两个一组输出)。
3、输入明文并对明文进行分组处理:
1)键盘输入明文,并将明文中的所有“j”转化为“i”。
2)扩展明文在适当的位置插入“q”,分两种情况:在串内,将明文字母串按两个字母一组进行分组,使得每组中的两个字母不同;
for(i=0;i<n1;i=i+2)//扩展明文
if(plain[i]==plain[i+1])
4、进行加密运算,加密方法:
1)按分组查找在密钥矩阵中的位置,并将下标进行记录,例:寻找奇数位明文的位置:for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(key1[i][j]==plain[k]){p1=i;q1=j;}
2)对明文按分组进行加密算法:
ⅰ、同一分组在同一行,密文为所在行紧靠明文右端的字母,其中注意第一列看做是最后一列的右端:if(p1==p2)
对每一对明文字母M1、M2的加密方法如下:
①若M1、M2在同一行时,则对应的密文C1和C2分别是紧靠M1、M2右端的字母。其中第一列被看做是最后一列的右方(解密时反向)。
②若M1、M2在同一列时,则对应的密文C1和C2分别是紧靠M1、M2下方的字母。其中第一行看做是最后一行的下方(解密时反向)。
③若M1、M2不在同一行,也不在同一列时,则C1和C2是由M1和M2确定的矩形的其他两角的字母,并且C1和M1、C2和M2同行(解密时处理方法相同)。