密码学课程设计.docx_第1页
密码学课程设计.docx_第2页
密码学课程设计.docx_第3页
密码学课程设计.docx_第4页
密码学课程设计.docx_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国矿业大学计算机学院 13 级本科生课程报告课程名称 密码学课程设计 报告时间 2016.1 学生姓名 邱翔宇 学 号 08133609 班 级 信息安全13-3 任课教师 李 昕 实验一:放射密码1、 实验目的学习仿射密码的具体工作原理,理解仿射密码的计算过程,并根据所知的知识进行放射密码的编程,编写出其加密和解密函数。运行程序进行实践。2、 实验内容加法密码和乘法密码结合构成仿射密码,仿射密码的加密和解密算法分别是:C= Ek(m)=(k1m+k2) mod nM= Dk(c)=k3(c- k2) mod n(其中(k3 k1)mod26 = 1)仿射密码具有可逆性的条件是gcd(k1, n)=1。当k1=1时,仿射密码变为加法密码,当k2=0时,仿射密码变为乘法密码。仿射密码中的密钥空间的大小为n(n),当n为26字母,(n)=12,因此仿射密码的密钥空间为1226 = 312。1) 代码:#include#includeusing namespace std;char v26=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;char l26=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;int Number(char x)for(int i=0;i26;i+)if(x=li) return (i+1);void JiaMi(string m) /加密int k1,k2;coutm;coutk1;coutk2;int c1,c2;int mlen;mlen=m.length();char *p,*q;p=new charm.length()+1;strcpy(p,m.c_str();q=new charm.length();int tmp;for(int i=0;im.length();i+) tmp=Number(pi);c1=tmp*k1+k2;c2=c1%26;qi=vc2-1;for(i=0;im.length();i+)coutqi ;coutendl;void JieMi(string m) /解密int k1,k2;coutm;coutk1;coutk2;int c1,c2;int j,tmp;char *p,*q;p=new charm.length()+1;strcpy(p,m.c_str();q=new charm.length();for(int i=0;im.length();i+)for(j=0;j26;j+)tmp=Number(lj); c1=tmp*k1+k2; c2=c1%26;if(vc2-1=pi)qi=lj;break;for(i=0;im.length();i+)coutqi ;coutendl;int main()string m;JiaMi(m);JieMi(m);return 0;2) 截图:实验小结:这个实验我学习仿射密码的具体工作原理,理解了仿射密码的计算过程,在根据所知的知识理解后进行放射密码的编程,编写出其加密和解密函数。运行程序进行实践。仿射密码是比较简单的一个试验了,但是也让我学习了很多。实验二:序列密码1、 实验目的学习线性反馈移位寄存器的具体工作原理,了解其计算方法步骤,并根据所知的知识进行线性反馈移位寄存器的编程,能够编写出其加密和解密函数。并且运行程序成功。2、 实验内容1) 代码#includeusing namespace std;void yiwei(bool y8) /移位函数bool x=y7y5y4y0;for(int i=0;i7;i+)yi=yi+1;y7=x;coutx;int main() int n=1;bool x8=1,0,1,0,0,1,1,0; /初始状态for(int i=0;i8;i+)coutxi;don+;yiwei(x);while(x0&(!x1)&x2&(!x3)&(!x4)&x5&x6&(!x67)=false);cout T=nendl;return 0;2) 截图实验小结:通过这一个实验的编程与学习,我学习了线性反馈移位寄存器的具体工作原理,并清晰了解其计算方法步骤,在根据所知的知识进行实践编写线性反馈移位寄存器的代码,能够编写出其加密和解密函数。并且能运行程序成功。这个实验比较短小,但是也汇聚了平时所学与实践的结合,我也在实验的过程中学到来很多。实验三:分组密码一、实验目的学习DES的具体工作原理,了解其计算方法步骤,并根据所学的知识进行DES的编程,编写出其加密和解密函数。并且运行程序成功。二、实验内容1) 过程:DES算法的入口参数有三个:Key, Data, ModeKey 为64bit密钥, Data为64bit数据,Mode为加密还是解密。DES算法的过程:1. 对输入的密钥进行变换。 用户的64bit密钥,其中第8, 16, 24, 32, 40, 48, 56, 64位是校验位, 使得每个密钥都有奇数个1。所以密钥事实上是56位。对这56位密钥进行如下表的换位。57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4,表的意思是第57位移到第1位,第49位移到第2位,. 以此类推。变换后得到56bit数据,将它分成两部分,C028, D028。2. 计算16个子密钥,计算方法Ci28 Di28为对前一个Ci-128, Di-128做循环左移操作。16次的左移位数如下表:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 (第i次)1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 (左移位数)3. 串联计算出来的Ci28 Di28 得到56位,然后对它进行如下变换得到48位子密钥Ki4814, 17,11, 24, 1, 5,3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32, 表的意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25, 35,38,43,54位丢弃。4. 对64bit的明文输入进行换位变换。换位表如下:58, 50, 12, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7表的意思就是第一次变换时,第58位移到第1位,第50位移到第2位,. 依此类推。得到64位数据,将这数据前后分成两块L032, R032。5. 加密过程,对Ri32进行扩展变换成48位数,方法如下, 记为E(Ri32)32,1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13,14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1,6. 将E(Ri32)与Ki48作异或运算,得到48位数,将48位数顺序分成8份,6位一份,B86。7. 使用Si替换Bi6。过程如下: 取出Bi6的第1位和第6位连成一个2位数m, m就是Si中对应的行数(0-3),取出Bi6的第2到第5位连成一个4位数n(0-15),n就是Si中对应的列数,用Simn代替Bi6。S是4行16列的对应表,里面是4位的数,一共有8个S,定义如下:S1: 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,S2: 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,S3: 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,S4: 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, S5: 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6: 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, S7: 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, S8: 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,8. 将从Bi6经过S得到的8个4位数连起来得到32位数。对这个数进行如下变换: 16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10, 2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25, 得到的结果与Li32作异或运算,把结果赋给Ri32。9. 把Ri-132的值赋给Li,从5开始循环。直到K1648结束。10. 将最后的L,R合并成64位,然后进行如下转化得到最后的结果。这是对第4步的一个逆变化。40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25以上是Des的加密过程,解密过程同样,只需要把16个子密钥Ki48的顺序颠倒过来就行了。代码:#include #include #include #define ENCRYPT 1#define DECRYPT 0static void printHex ( char *cmd, int len );static void printArray ( const char *In, int len );static void F_func ( bool In32, const bool Ki48 ); / f函数static void S_func ( bool Out32, const bool In48 ); / S盒代替static void Transform ( bool *Out, bool *In, const char *Table, int len ); / 变换static void Xor ( bool *InA, const bool *InB, int len ); / 异或static void RotateL ( bool *In, int len, int loop ); / 循环左移static void ByteToBit ( bool *Out, const char *In, int bits ); / 字节组转换成位组static void BitToByte ( char *Out, const bool *In, int bits ); / 位组转换成字节组/ 16位子密钥static bool SubKey1648;/ 64位经过PC1转换为56位 (PC-1)const static char PC1_Table56 =57, 49, 41, 33, 25, 17, 9,1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27,19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15,7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29,21, 13, 5, 28, 20, 12, 4;/ 左移const static char LOOP_Table16 =1, 1, 2, 2, 2, 2, 2, 2,1, 2, 2, 2, 2, 2, 2, 1;/ 排列选择 2 (PC-2)const static char PC2_Table48 =14, 17, 11, 24, 1, 5,3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8,16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55,30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53,46, 42, 50, 36, 29, 32;/ Ri_1(32位)经过变换E后膨胀为48位 (E) void F_funcstatic const char E_Table48 =32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1;/ 8个4比特合并为32比特的排列 Pconst static char P_Table32 =16, 7, 20, 21,29, 12, 28, 17,1, 15, 23, 26,5, 18, 31, 10,2, 8, 24, 14,32, 27, 3, 9,19, 13, 30, 6,22, 11, 4, 25,;/ 经过S盒 S-boxesconst static char S_Box8416 =/ S1 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 , 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 , 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 , 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 ,/ S2 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 , 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 , 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 , 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 ,/ S3 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 , 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 , 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 , 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 ,/ S4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 , 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 , 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 , 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 ,/ S5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 , 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 , 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 , 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 ,/ S6 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 , 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 , 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 , 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 ,/ S7 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 , 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 , 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 , 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 ,/ S8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 , 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 , 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 , 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ;/ 初始排列 (IP)const static char IP_Table64 =58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7;/ L16与R16合并后经过IP_1的最终排列 (IP*-1)const static char IPR_Table64 =40, 8, 48, 16, 56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30,37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25;void Des_SetKey ( const char Key8 ); /生成子密钥void Des_Run ( char Out8, char In8, bool Type ); /DES算法int main ()char key12=1,2,3,4,5,6,7,8;char str12;char str212;/printArray( PC2_Table, sizeof(PC2_Table)/sizeof(PC2_Table0) );scanf(%s,&str);printf ( Before encrypting: );puts ( str );Des_SetKey ( key );memset ( str2, 0, sizeof ( str2 ) );Des_Run ( str2, str, ENCRYPT );printf ( After encrypting: );/printf(%sn,str2);printHex ( str2, 8 );memset ( str, 0, sizeof ( str ) );printf ( After decrypting: );Des_Run ( str, str2, DECRYPT );puts ( str ); return 0;void Des_SetKey ( const char Key8 )int i;static bool K64, *KL = &K0, *KR = &K28;ByteToBit ( K, Key, 64 ); /转换为二进制Transform ( K, K, PC1_Table, 56 ); /64比特的密钥K,经过PC-1后,生成56比特的串。/生成16个子密钥for ( i=0; i16; i+ )/循环左移,合并RotateL ( KL, 28, LOOP_Tablei );RotateL ( KR, 28, LOOP_Tablei );Transform ( SubKeyi, K, PC2_Table, 48 );void Des_Run ( char Out8, char In8, bool Type )int i;static bool M64, tmp32, *Li = &M0, *Ri = &M32;/转换为64位的数据块ByteToBit ( M, In, 64 );/IP置换 (初始)Transform ( M, M, IP_Table, 64 );/该比特串被分为32位的L0和32位的R0两部分。if ( Type = ENCRYPT )/16轮置换for ( i=0; i=0; i- )memcpy ( tmp, Li, 32 );F_func ( Li, SubKeyi );Xor ( Li, Ri, 32 );memcpy ( Ri, tmp, 32 );/R16与L16合并成64位的比特串。R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得的比特串就是密文。Transform ( M, M, IPR_Table, 64 );BitToByte ( Out, M, 64 );/将32比特的输入再转化为32比特的输出void F_func ( bool In32, const bool Ki48 )static bool MR48;/输入Ri-1(32比特)经过变换E后,膨胀为48比特Transform ( MR, In, E_Table, 48 );/异或Xor ( MR, Ki, 48 );/膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。S_func ( In, MR );/该32比特经过P变换后,输出的比特串才是32比特的f (Ri-1,Ki)。Transform ( In, In, P_Table, 32 );void S_func ( bool Out32, const bool In48 )char j,m,n;/膨胀后的比特串分为8组,每组6比特。for ( j=0; j8; j+,In+=6,Out+=4 )/在其输入In0,In1,In2,In3,In4,In5中,计算出m=In0*2+In5, n=In4+In3*2+In2*4+In1*8,再从Sj表中查出m行,n列的值Smn。将Smn化为二进制,即得Si盒的输出。m = ( In01 ) + In5;n = ( In13 ) + ( In22 ) + ( In31 ) + In4;ByteToBit ( Out, &S_Box ( int ) j ( int ) m ( int ) n, 4 );/ 打印指定位置指定长度HEX值static void printHex ( char *cmd, int len )int i;for ( i=0; ilen; i+ )printf ( %02X, ( unsigned char ) cmdi );printf ( n );/ 打印数组测试用static void printArray ( const char *In, int len )int i;char tmp256;memset ( tmp, 0, sizeof ( tmp ) );for ( i=0; ilen; i+ )tmp ( int ) Ini=Ini;for ( i=0; ilen; i+ )printf ( %02d, ( unsigned char ) tmpi );printf ( n );void Transform ( bool *Out, bool *In, const char *Table, int len )int i;static bool tmp256;for ( i=0; ilen; i+ )tmpi = In Tablei-1 ;memcpy ( Out, tmp, len );void Xor ( bool *InA, const bool *InB, int len )int i;for ( i=0; ilen; i+ )InAi = InBi;void RotateL ( bool *In, int len, int loop )static bool tmp256; / Sample: loop=2memcpy ( tmp, In, loop ); / In=12345678 tmp=12memcpy ( In, In+loop, len-loop ); / In=345678memcpy ( In+len-loop, tmp, loop ); / In=34567812/ Sample:/ In = 0x01/ Out = 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00void ByteToBit ( bool *Out, const char *In, int bits )int i;for ( i=0; i ( i%8 ) ) & 1;void BitToByte ( char *Out, const bool *In, int bits )int i;memset ( Out, 0, ( bits+7 ) /8 );for ( i=0; ibits; i+ )Outi/8 |= Ini ( i%8 );2) 截图实验小结:这个实验我学习了DES的具体工作原理,能够了解其计算方法步骤,并根据所学的知识进行DES的编程,编写了出其加密和解密函数。并且运行程序成功了。但是这个程序超级长,在编写的过程中我回顾来很多C+的基础知识让我获益很多,在不懈的努力下终于成功了。实验四 Hash函数一、实验目的学习Hash函数的具体工作原理,了解其计算原理过程,并能所知的知识进行Hash函数的编程,编写出其加密和解密函数。并且运行程序成功。二、实验内容:1)过程对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit); 第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。 第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。 第四步、四轮循环运算:循环的次数是分组的个数(N+1) 1)将每一512字节细分成16个小组,每个小组64位(8个字节) 2)先认识四个线性函数(&是与,|是或,是非,是异或) F(X,Y,Z)=(X&Y)|(X)&Z) G(X,Y,Z)=(X&Z)|(Y&(Z) H(X,Y,Z)=XYZ I(X,Y,Z)=Y(X|(Z) 3)设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) 4)四轮运算 第一轮a=FF(a,b,c,d,M0,7,0xd76aa478)b=FF(d,a,b,c,M1,12,0xe8c7b756)c=FF(c,d,a,b,M2,17,0x242070db)d=FF(b,c,d,a,M3,22,0xc1bdceee)a=FF(a,b,c,d,M4,7,0xf57c0faf)b=FF(d,a,b,c,M5,12,0x4787c62a)c=FF(c,d,a,b,M6,17,0xa8304613)d=FF(b,c,d,a,M7,22,0xfd469501)a=FF(a,b,c,d,M8,7,0x698098d8)b=FF(d,a,b,c,M9,12,0x8b44f7af)c=FF(c,d,a,b,M10,17,0xffff5bb1)d=FF(b,c,d,a,M11,22,0x895cd7be)a=FF(a,b,c,d,M12,7,0x6b901122)b=FF(d,a,b,c,M13,12,0xfd987193)c=FF(c,d,a,b,M14,17,0xa679438e)d=FF(b,c,d,a,M15,22,0x49b40821)第二轮a=GG(a,b,c,d,M1,5,0xf61e2562)b=GG(d,a,b,c,M6,9,0xc040b340)c=GG(c,d,a,b,M11,14,0x265e5a51)d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论