密码学课程设计报告(5)

来源:网络收集 时间:2025-06-20 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

密码学课程设计

} else i = 0;

/* Buffer remaining input */

/*将输入缓冲区中的不足填充满512bits的剩余内容填充到context->buffer中,留待以后再作处理*/

R_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); }

/* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ /*获取加密 的最终结果 digest:保存最终的加密串

context:你前面初始化并填入了信息的md5结构 */

void MD5Final (unsigned char digest[16],MD5_CTX *context) {

unsigned char bits[8];

unsigned int index, padLen;

/* Save number of bits */

/*将要被转换的信息(所有的)的bits长度拷贝到bits中*/ Encode(bits, context->count, 8);

/* Pad out to 56 mod 64. */

/* 计算所有的bits长度的字节数的模64, 64bytes=512bits*/ index = (unsigned int)((context->count[0] >> 3) & 0x3f);

/*计算需要填充的字节数,padLen的取值范围在1-64之间*/ padLen = (index < 56) ? (56 - index) : (120 - index);

/*这一次函数调用绝对不会再导致MD5Transform的被调用,因为这一次不会填满512bits*/

MD5Update(context, PADDING, padLen);

/* Append length (before padding) */

/*补上原始信息的bits长度(bits长度固定的用64bits表示),这一次能够恰巧凑够512bits,不会多也不会少*/ MD5Update(context, bits, 8);

/* Store state in digest */

/*将最终的结果保存到digest中。ok,终于大功告成了*/ Encode(digest, context->state, 16);

21

密码学课程设计

/* Zeroize sensitive information. */

R_memset((POINTER)context, 0, sizeof(*context)); }

/* MD5 basic transformation. Transforms state based on block. */ /*

对512bits信息(即block缓冲区)进行一次处理,每次处理包括四轮

state[4]:md5结构中的state[4],用于保存对512bits信息加密的中间结果或者最终结果

block[64]:欲加密的512bits信息 */

static void MD5Transform (UINT4 state[4], unsigned char block[64]) {

UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];

Decode(x, block, 64);

/* Round 1 */

FF(a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF(d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF(c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF(b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF(a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF(d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF(c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF(b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF(a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF(d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

/* Round 2 */

GG(a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG(d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG(a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */

22

密码学课程设计

GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG(a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

/* Round 3 */

HH(a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH(a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

/* Round 4 */

II(a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II(d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II(b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II(d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II(b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II(a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II(c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II(a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */

23

密码学课程设计

II(b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

state[0] += a; state[1] += b; state[2] += c; state[3] += d;

/* Zeroize sensitive information. */ R_memset((POINTER)x, 0, sizeof(x)); }

/* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */

/*将4字节的整数copy到字符形式的缓冲区中 output:用于输出的字符缓冲区

input:欲转换的四字节的整数形式的数组

len:output缓冲区的长度,要求是4的整数倍 */

static void Encode(unsigned char *output, UINT4 *input,unsigned int len) {

unsigned int i, j;

for(i = 0, j = 0; j < len; i++, j += 4) {

output[j] = (unsigned char)(input[i] & 0xff);

output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } }

/* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */

/*与上面的函数正好相反,这一个把字符形式的缓冲区中的数据copy到4字节的整数中(即以整数形式保存) output:保存转换出的整数 input:欲转换的字符缓冲区

len:输入的字符缓冲区的长度,要求是4的整数倍 */

static void Decode(UINT4 *output, unsigned char *input,unsigned int len) {

unsigned int i, j;

for(i = 0, j = 0; j < len; i++, j += 4)

output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |

24

密码学课程设计

(((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); }

////////////////////////////////////////////////////////////////////////////////

// md5test.cpp : Defines the entry point for the console application. //

#include \#include \

int main(int argc, char* argv[]) {

MD5_CTX md5;

MD5Init(&md5); //初始化用于md5加密的结构

unsigned char encrypt[200]; //存放于加密的信息 unsigned char decrypt[17]; //存放加密后的结果 scanf(\ //输入加密的字符

MD5Update(&md5,encrypt,strlen((char *)encrypt)); //对欲加密的字符进行加密

MD5Final(decrypt,&md5); //获得最终结果

printf(\加密前:%s\\n加密后:\ for(int i=0;i<16;i++)

printf(\

printf(\加密结束!\\n\

return 0; }

2.4 关键算法分析如下: 主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行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))

25

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库密码学课程设计报告(5)在线全文阅读。

密码学课程设计报告(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/642591.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219