算法实现
3.2 算法流程图
RSA加密此密钥 数据流 DES密钥 加密图像 文件头 摘要水印 原始图像 摘要水印 DES加密 加密图像 摘要水印 解密 解密后图像 算法 摘要 作为水印信息 摘要水印 3.3 报文摘要提取
MD5算法是由 Rivest(RSA中的R)于1991年提出的Hash算法。今天已成为最广泛使用的Hash算法。MD5算法并非是Rivest提出的首个Hash 算法,1990年Rivest就已提出了一个Hash算法 MD4,并被接受为标准,MD5算法是MD4算法的改进。MD5和MD4算法都是将消息划分成512位的消息块进行处理,最终形成128位的信息摘要。
实现MD5算法主要经过以下五个步骤: (1) 补位
补位的目标是使输入的消息长度,从任意值变成一个新的长度n,使得n=448(mod512),即通过补位使消息长度差64位成为512的整数倍,即使原消息的长度正好满足要求,也需要进行补位。补位的补丁包括一个1,剩下的全是0,在原消息之后。特别地,如果原消息的长度正好满足要求,则补位包括一个1和512个0。
12
MD5 提取水印对此,看是否一致?以达到图像认证的目的! 摘要
图3-1 算法流程图
算法实现
(2) 追加长度
在追加长度前,通过补位,消息长度已经变成模512余448,接下来的追加长度将在消息后继续补充64位的信息,新消息将是512的整数倍。追加长度的信息由64位表示,被追加到已补的信息后,如果原消息长度超过64位,只使用低64位。追加的长度是原消息的长度,而不是补位后的信息长度。
(3)缓冲区初始化
为了计算Hash函数的结果,需首先设置128位的缓冲区。缓冲区除接受Hash函数最终结果外,还记录中间结果。
在图3-2中,将缓冲区分成4等份,即4个32位寄存器(A,B,C,D),每个32位寄存器也被称为字。 Buffer n Block n 512位A B 128位C D 第一轮 第二轮 M[k] A B C D + CLSS + + 第三轮 第四轮 T[i] CLSS+ + + + 128位+ A B C D
Buffer n+1 图3-2 缓冲区 n->n+1 示意图 图3-3 四轮算法
赋初值:
A: 0x01234567 B: 0x89abcdef
C: 0xfedcba98 D: 0x76543210 ABCD构成 buffer0。 (4)消息迭代
从buffer0开始,进行算法的主循环,循环的次数是消息中512位消息分组
13
算法实现
的数目,将上面四个变量复制到另外的变量中:A到a,B到b,C到c,D到d。主循环有四轮,每轮很相似,每一轮进行16次操作,每次操作对a,b,c 和d中的其中三个作一次线性函数运算,然后将所得的结果加上第四个变量,文本的一个子分组和一个常数,再将所得的结果向右环移一个不定的数,并加上或中之一,最后用该结果取代a,b,c或d中之一。主循环的运算过程见图3-4。
消息分组 A B C D 第一轮 第二轮 第三轮 第四轮 A B C D 图3-4 MD5主循环
在四轮运算中,有四种函数,分别为F(X,Y,Z),G(X,Y,Z),H(X,Y,Z)和I(X,Y,Z):
F(X,Y,Z)=(X and Y) or (not (X) and Z) G(X,Y,Z)=(X and Z) or (Y and not (Z)) H(X,Y,Z)=X xor Y xor Z I(X,Y,Z)=Y xor (X or not(Z))
这些函数是这样设计的:如果 X,Y 和 Z 的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。函数 F 是按逐位方式操作:如果 X,那么 Y,否则 Z。函数H是逐位奇偶操作符。
设 Mj 表示消息的第j个子分组(从 0 到 15),<<
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+ Mj + ti)<<
第1轮:
FF (a, b, c, d, M[ 0], 11, 0xd76aa478);
14
算法实现
FF (d, a, b, c, M[ 1], 12, 0xe8c7b756); FF (c, d, a, b, M[ 2], 13, 0x242070db); FF (b, c, d, a, M[ 3], 14, 0xc1bdceee); FF (a, b, c, d, M[ 4], 11, 0xf57c0faf);
FF (d, a, b, c, M[ 5], 12, 0x4787c62a); FF (c, d, a, b, M[ 6], 13, 0xa8304613); 第2轮:FF (b, c, d, a, M[ 7], 14, 0xfd469501); FF (a, b, c, d, M[ 8], 11, 0x698098d8); FF (d, a, b, c, M[ 9], 12, 0x8b44f7af); FF (c, d, a, b, M[10], 13, 0xffff5bb1); FF (b, c, d, a, M[11], 14, 0x895cd7be); FF (a, b, c, d, M[12], 11, 0x6b901122); FF (d, a, b, c, M[13], 12, 0xfd987193); FF (c, d, a, b, M[14], 13, 0xa679438e); FF (b, c, d, a, M[15], 14, 0x49b40821);
GG (a, b, c, d, M[ 1], 21, 0xf61e2562); GG (d, a, b, c, M[ 6], 22, 0xc040b340); GG (c, d, a, b, M[11], 23, 0x265e5a51); GG (b, c, d, a, M[ 0], 24, 0xe9b6c7aa); GG (a, b, c, d, M[ 5], 21, 0xd62f105d); GG (d, a, b, c, M[10], 22, 0x2441453); GG (c, d, a, b, M[15], 23, 0xd8a1e681); GG (b, c, d, a, M[ 4], 24, 0xe7d3fbc8); GG (a, b, c, d, M[ 9], 21, 0x21e1cde6); GG (d, a, b, c, M[14], 22, 0xc33707d6); GG (c, d, a, b, M[ 3], 23, 0xf4d50d87); GG (b, c, d, a, M[ 8], 24, 0x455a14ed); GG (a, b, c, d, M[13], 21, 0xa9e3e905); GG (d, a, b, c, M[ 2], 22, 0xfcefa3f8); GG (c, d, a, b, M[ 7], 23, 0x676f02d9);
15
算法实现
GG (b, c, d, a, M[12], 24, 0x8d2a4c8a);
第3轮:
HH (a, b, c, d, M[ 5], 31, 0xfffa3942);
HH (d, a, b, c, M[ 8], 32, 0x8771f681); HH (c, d, a, b, M[11], 33, 0x6d9d6122); HH (b, c, d, a, M[14], 34, 0xfde5380c); 第4轮:
HH (a, b, c, d, M[ 1], 31, 0xa4beea44); HH (d, a, b, c, M[ 4], 32, 0x4bdecfa9); HH (c, d, a, b, M[ 7], 33, 0xf6bb4b60); HH (b, c, d, a, M[10], 34, 0xbebfbc70); HH (a, b, c, d, M[13], 31, 0x289b7ec6); HH (d, a, b, c, M[ 0], 32, 0xeaa127fa); HH (c, d, a, b, M[ 3], 33, 0xd4ef3085); HH (b, c, d, a, M[ 6], 34, 0xe4881d05); HH (a, b, c, d, M[ 9], 31, 0xd9d4d039); HH (d, a, b, c, M[12], 32, 0xe6db99e5); HH (c, d, a, b, M[15], 33, 0x1fa27cf8); HH (b, c, d, a, M[ 2], 34, 0xc4ac5665);
II (a, b, c, d, M[ 0], 41, 0xf4292244); II (d, a, b, c, M[ 7], 42, 0x432aff97); II (c, d, a, b, M[14], 43, 0xab9423a7); II (b, c, d, a, M[ 5], 44, 0xfc93a039); II (a, b, c, d, M[12], 41, 0x655b59c3); II (d, a, b, c, M[ 3], 42, 0x8f0ccc92); II (c, d, a, b, M[10], 43, 0xffeff47d); II (b, c, d, a, M[ 1], 44, 0x85845dd1); II (a, b, c, d, M[ 8], 41, 0x6fa87e4f); II (d, a, b, c, M[15], 42, 0xfe2ce6e0); II (c, d, a, b, M[ 6], 43, 0xa3014314); II (b, c, d, a, M[13], 44, 0x4e0811a1);
16