密码学课程设计报告目录实验一凯撒加密算法 (1)1.1算法简介 (1)1.2算法原理 (1)1.3加解密算法 (1)1.4运行截图 (2)实验二MD5算法2.1算法简介 (3)2.2 算法分析 (3)2.3 算法步骤 (4)2.4运行截图 (5)实验三分组密码AES加密解密 (6)3.1 算法概述 (6)3.2 算法设计思路 (6)3.3运行结果 (8)实验四椭圆曲线加密算法 (9)4.1 算法简介 (9)4.2算法设计 (9)4.3 运行结果 (9)实验总结 (10)实验一凯撒加密算法1.1算法简介著名的凯撒加密算法就是一种简单的替代加密法,它是将明文中每一个字符用右移3位并以26个字符为模的替代(A由D替代,B由E替代,··…—,W由Z 替代,X由A替代,Y由B替代,Z由C替代)。
1.2基本原理在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。
密钥和协议(算法)。
凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。
置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。
凯撒密码的加密算法极其简单。
其加密过程如下:在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。
凯撒密码的加密过程可记为如下一个变换:c≡m+k mod n (其中n为基本字符个数)同样,解密过程可表示为:m≡c+k mod n (其中n为基本字符个数)对于计算机而言,n可取256或128,m、k、c均为一个8bit的二进制数。
显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。
当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。
1.3加解密算法恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。
例如,当偏移量是左移3的时候(解密时的密钥就是3):明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。
需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。
例如:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ恺撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。
首先将字母用数字代替,A=0,B=1,...,Z=25。
此时偏移量为n的加密方法即为:加密:E (x)= (x+n) mod 2解密:D (x)= (x-n) mod 21.4运行截图:实验二 MD5算法2.1 算法简介MD5算法是MD4算法的改进算法。
Ron Rivest 于1990年提出MD4单向散列函数,MD表示消息摘要(Message Digest),对输入消息,算法产生128位散列值。
该算法首次公布之后,Bert den Boer和Antoon Bosselaers 对算法三轮中的后两轮进行了成功的密码分析。
在一个不相关的分析结果中,Ralph MerKle成功地攻击了前两轮。
尽管这些攻击都没有扩展到整个算法,但Rivest还是改进了其算法,结果就是MD5算法。
MD5算法是MD4的改进算法,它比MD4更复杂,但设计思想相似,输入的消息可任意长,输出结果也仍为128位,特别适用于高速软件实现,是基于32-位操作数的一些简单的位操作。
2.2 算法分析2.2.1 MD5的安全性Ron Rivest概述了MD5安全性:a.与MD4相比,增加了第四轮。
b.每一步均有唯一的加法常数。
c.为减弱第二轮中函数G的对称性从((X∧Y) ∨(X∧Z) ∨(Y∧Z))变为((X∧Z) ∨(Y∧( Z)))。
d.每一步加上了上一步的结果,引起更快的雪崩效应。
e. 改变了第二轮和第三轮中访问消息子分组的次序,使其形式更不相似。
f. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。
各轮的位移量互不相同。
从安全角度讲,MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1 000 000 000个消息的计算机需时1.07×1022年。
若采用生日攻击法,寻找有相同Hash值的两个消息需要试验264个消息,用每秒可试验1 000 000 000个消息的计算机需时585年。
1.2.2实现方法由于此处的文件校验用到要求比较高的场合,故采用了方法6,md5校验算法,从CodeGuru下载了一个md5校验算法的实现模块,加入自己要校验的文件名,实现完成。
下面具体描述一下实现过程:1、创建一个简单的对话框程序;2、设置CString类型的变量m_filename和m_strFileChecksum以存放要校验的文件名和校验和;3、在对话框类中创建ChecksumSelectedFile()函数,调用md5校验和类(附录中有其实现文件)中的GetMD5计算文件校验和。
4、使用定时器定时巡检该文件的校验和,一旦发现校验和发生变化,立刻出现提示。
2.3算法步骤将输入消息按512-位分组,最后要填充成为512位的整数倍,且最后一组的后64位用来填充消息长度(填充前)。
填充方法为附一个1在消息后,后接所要求的多个0。
这样可以确保不同消息在填充后不相同。
由于留出64位用来表示消息长度,那么消息的长度最多可达264字节,相当于4G×4G字节,文件的长度是不可能达到这么大,因此通常都是只采用64位中的低32位来表示消息长度,高32位填充0。
初始化MD变量。
由于每轮输出128位,这128位可用下面四个32位字A,B,C,D来表示。
其初始值设为:A=0x01234567B=0x89ABCDEFC=0xFEDCBA98D=0x76543210开始进入算法主循环,循环的次数是消息中512位消息分组的数目。
先将上面A、B、C、D四个变量分别复制到另外四个变量a、b、c、d中去。
主循环有四轮,每轮很相似。
每轮进行16次操作,每次操作对a、b、c、d四个变量中的三个作一次非线性函数运算,然后将所得结果加上第四个变量,消息的一个子分组和一个常数。
再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。
最后用该结果取代a,b,c或d中之一。
以下是每次操作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z)=(X∧Y)∨(( X)∧Z)G(X,Y,Z)=(X∧Z)∨(Y∧( Z))H(X,Y,Z)=X⊕Y⊕ZI(X,Y,Z)=Y⊕(X∨( Z))其中,⊕是异或,∧是与,∨是或,是反符号。
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
函数F是按逐位方式操作:如果X,那么Y,否则Z。
函数H是逐位奇偶操作符。
设Mj表示消息的第j个子分组(从0到15),<<<s表示循环左移s,则四种操作为:FF(a,b,c,d,Mj,s,ti)表示a = b+((a+F(b,c,d)+ Mj + ti)<<<s)GG(a,b,c,d,Mj,s,ti)表示a = b+((a+G(b,c,d)+ Mj + ti)<<<s)HH(a,b,c,d,Mj,s,ti)表示a = b+((a+H(b,c,d)+ Mj + ti)<<<s)II(a,b,c,d,Mj,s,ti)表示a = b+((a+I(b,c,d)+ Mj + ti)<<<s)四轮(64步)结果略。
注:常数ti的选择:第i步中,ti是232 ×abs (sin(i))的整数部分,i的单位是弧度。
所有这些完成之后,将A,B,C,D分别加上a,b,c,d。
然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。
最后得到的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组成128位输出结果。
2.5 运行截图实验三分组密码AES加密解密3.1算法概述AES算法是一个迭代型分组密码,其分组长度和密钥长度都可变,各自可以为128比特、192比特、256比特。
AES算法对明文以字节为单位进行处理,这里我们以128位的分组、128位密钥的情况为例。
首先将明文按字节分成列组,将明文的前4个字节组成一列,接下来的4个字节组成第二列,后面的字节依次组成第三列和第四列,则组成了一个4乘4的矩阵。
这样AES输入的16个字节排成了一个二维数组,称之为状态矩阵。
AES的加密解密变换都是基于状态数组来处理的,在中间结果上的不同变换操作称为状态。
同样,密钥也可以表示成一个矩阵。
3.2算法设计思路3.2.1 AES的加密变换AES的加密变换有最基本的变换单位—“轮”多次迭代而成,而当组长度与=10。
我们将AES中的轮变换记为Round,密钥分组长度均为128比特时,轮数位NrState表示消息矩阵,RoundKey表示轮密钥矩阵。
一轮的完成将改变State矩阵中的元素,称为改变它的状态。
对于加密来说,输入到第一轮的State就是明文消息矩阵,最后一轮输出的State就是对应的密文消息矩阵。
AES的轮(除最后一轮外)变换由四个不同的变换组成,这些变换我们称之为内部轮函数,AES的轮可表示成如下形式:Round(State,RoundKey){ByteSub(State);ShiftRows(State);MixColumns(State);AddRoundKey(State,RoundKey);}其中,ByteSub(State)称为字节变换,ShiftRow(State)称为移位变换MixColumn(State)称为列混合变换以及AddRoundKey(State,RoundKey)为与子密钥异或。
最后一轮略微的不同,将其记作FinalRoundKey(State,RoundKey),相当于前面的Round(State,RoundKey)去掉MixColumns(State)。
从图六我们可以清楚的看到AES的算法执行过程为:(1)给定的明文M,将State初始换为M,并进行AddRoundKey(State,RoundKey),将RoundKey与State进行异或运算;(2)对于前N轮中的每一轮,分别执行Round(State,RoundKey)过程;r-1(3)执行最后一轮FinalRoundKey(State,RoundKey)过程,即只执行ByteSub(State)、ShiftRows(State)、AddRoundKey(State,RoundKey)这三个操作。