两种基本古典密码设计与实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二两种基本古典密码设计与实现

091234 谢锦仪一、实验目的:

该实验为验证性实验。

通过本实验,使学生对于两种基本的古典密码编码方法(“代替”与“移位”)产生深刻的感性认识,体验清楚二者之间的本质差异,为理解和掌握现代密码的相应知识打下良好基础。

二、实验内容:

1.设计一个周期3的多表代换并予以实现,要求:第一个表有密钥字法产生(密钥字自拟),第二个表由洗牌法产生(注意,字母a~z与数字0~25一一对应,洗牌法即相当于实验一的方法1(n=25)),第三个表由公式法产生(数学公式自拟,注意它须是Z26上的一个一一变换)。

2.设计一个周期5的16-置换移位密码并予以实现,要求:5个16-置换至少有一个是由实验一(n=15)提供的两个方法以为、自行设计的其它方法产生。

三、实验要求:

1. 上述两个古典密码的编程实现,须能对下面一段明文进行正确加密(对代

替密码,空格和标点符号保持不动;对移位密码,空格和标点符号也移位):

Q is a symmetric block cipher. It is defined for a block size of 128 bits. It allows arbitrary length passwords. The design is fairly conservative. It consists of a simple substitution-permutation network. In this paper we present the cipher, its design criteria and our analysis. The design is based on both Rjindael and Serpent. It uses an 8-bit s-box from Rjindael with the linear mixing layers replaced with two Serpent style bit-slice s-boxes and a linear permutation. The combination of methods eliminates the high level structure inherent in Rjindaelwhile having better speed and avalanche characteristics than Serpent. Speedis improved over Serpent. This version 2.00 contains better analysis, editorialchanges, and an improved key scheduling algorithm. The number ofrecommended rounds is also increased.

2. 抓图显示密文(附页),不能出现明显错误。

四、实验步骤:

1、实验思路

对于代替密码,难点是大小写的转化和保持加密后大小写的不变。这里利用了专门的字符处理函数库ctype。用Tolower函数将大写转化为小写,然后转化为数字。这样才能容易的实现代替加密的过程。在密钥字算法的实现中,利用字符串处理函数的功能,在拼接比较后,录入到choicewords中,最后进入keytab,作为密钥的一部分。洗牌法我用的是实验一自己设计的方法,很简单就融入了这个程序之中。

移位密码:由于老师要求用一种全新的产生全排列的方法,我于是想到了RSA公钥体制。这里面RSA算法是密码学三大算法之一(RSA、MD5、DES),是一种不对称密码算法。

说如果满足条件:D是素数,N是两个素数(P,Q)之积,(D * E) mod ((P-1) * (Q-1))=1,那么存在C与A(范围从2到N-1)一一对应,且C=(A EXP D)mod N。A是一个有顺序的数,C就是一个看似无规律的伪随机数。Mod运算表示求模,例如7Mod3=1。意思是7除以3余1。类似地8 Mod 3=2,9 Mod 3=0。EXP表示前面数的后面数次方,其中还有两个附加条件:1,P和Q不能一样。2,e<(P-1)(Q-1)且e与(P-1)(Q-1)的最大公因数为1。具体实现的时候,我把1随机安插进去,就成了一个随机全排列了。具体的代码见附录。

而在利用时间种子产生随机数的函数中,为了避免重复,我在数组b录入元素后,令数组a对应的为0,然后再a不为0时录入b,十分简单。而将三种方法合并为密钥表的做法与代替的例子类似,这里就不说了。

在最后输出的时候有一个与代替密码不一样的问题:虽然都是由几组密钥组成的keytab,但是黛米可以不分组变换,而移位的密钥表是16*5,不分组变换效果很差。所以在输出的时候利用i<16时,(i-1)/16为0这一性质,实现了分组变换输出。

2、实验过程

这些代码中很多都在做一个工作:去掉重复的元素,将无重复的存入数组进行后续处理。根据不同的情况,也使用不同的方法:先存入另一数组,比较后存入处理数组;或者存入一个初始值进处理数组,然后每录入一个就比较一次。这两种方法显然后一种是更好的,但有时确实又需要辅助数组,这就需要视具体情况而定。

五、实验结果:

1、代替密码

2、移位密码

六、实验体会:

这次的实验由于有老师提供的参考代码,困难程度并不像代码的长度那般惊人。代替密码的ctype函数库是一个重点,我们开始都犹豫大写的明文加密后如何保持大写不变,另设一组变换时行不通的。如将大写字母与另外26个数字相对应,那么就要准备两张keytab,而且程序的复杂度会增加很多。但是利用了isupper函数后这个就简单了,至于公式法,密钥字法和洗牌法,有实验一的思考结果在,都是不难的。

移位密码开始不知道怎么做,不过在上网查过资料之后找到了一种较好的伪随机产生方法。

这次实验还是有一定的难度,但是有老师给的代码,所以不用花太多的时间来编写程序,大大降低了实验难度。以后的实验应该会越来越难,应该做好预习工作。

七、思考题:

“代替表”与“置换”的不动点、逆等是否一致?

答:不一致。代替是约定明文集合到另一集合的关系,不一定是原集合,而移位是在明文集合中进行随机排列然后得到的密文。两者的不动点、逆,只有在统一集合变换时菜可能一致。

相关文档
最新文档