应用密码学第6上机及作业.docx
- 文档编号:5775876
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:7
- 大小:17.14KB
应用密码学第6上机及作业.docx
《应用密码学第6上机及作业.docx》由会员分享,可在线阅读,更多相关《应用密码学第6上机及作业.docx(7页珍藏版)》请在冰豆网上搜索。
应用密码学第6上机及作业
上机实验报告(六)
实验课程:
应用密码学实验时间:
2014年12月26日
任课教师:
刘光军
班级:
12级信息与计算科学专业2班姓名:
学号:
一、实验名称:
SHA-1算法的实现
二、实验目的
1、了解SHA-1算法的基本原理
2、掌握SHA-1算法的实现方法
三、实验内容
1、掌握SHA-1算法的原理及过程
2、完成字符串数据的SHA-1运算及算法流程
四、报告正文(文档,数据,模型,程序,图形)
1、讨论学习SHA-1算法的基本原理,请给出算法的流程描述并画出算法的实现流程图。
2、用C或C++设计实现相应的功能模块,并给出最后的测试结果。
#ifndef_SHA1_H_
#define_SHA1_H_
/**//*sha1.h*/
#ifndef_SHA_enum_
#define_SHA_enum_
enum
...{
shaSuccess=0,
shaNull, /**//*Nullpointerparameter*/
shaInputTooLong, /**//*inputdatatoolong*/
shaStateError /**//*calledInputafterResult*/
};
#endif
#defineSHA1HashSize20
typedefstructSHA1Context
...{
DWORDIntermediate_Hash[SHA1HashSize/4];//MessageDigest
DWORDLength_Low; //Messagelengthinbits
DWORDLength_High; //Messagelengthinbits
intMessage_Block_Index; //Indexintomessageblockarray
unsignedcharMessage_Block[64]; //512-bitmessageblocks
intComputed; //Isthedigestcomputed?
intCorrupted; //Isthemessagedigestcorrupted?
}SHA1Context;
//FunctionPrototypes
CStringGetSHA1String(CStringsSource);
intSHA1Reset(SHA1Context*);
intSHA1Input(SHA1Context*,constunsignedchar*,unsignedint);
intSHA1Result(SHA1Context*,unsignedcharMessage_Digest[SHA1HashSize]);
CStringSha1toBase32(constunsignedchar*);
#endif
==================================================================================
#include"sha1.h"
//DefinetheSHA1circularleftshiftmacro
#defineSHA1CircularShift(bits,word)(((word)<<(bits))|((word)>>(32-(bits))))
//LocalFunctionPrototyptes*/
voidSHA1PadMessage(SHA1Context*);
voidSHA1ProcessMessageBlock(SHA1Context*);
intSHA1Reset(SHA1Context*c)
...{
if(!
c)
returnshaNull;
c->Length_Low =0;
c->Length_High =0;
c->Message_Block_Index =0;
c->Intermediate_Hash[0] =0x67452301;
c->Intermediate_Hash[1] =0xEFCDAB89;
c->Intermediate_Hash[2] =0x98BADCFE;
c->Intermediate_Hash[3] =0x10325476;
c->Intermediate_Hash[4] =0xC3D2E1F0;
c->Computed =0;
c->Corrupted=0;
returnshaSuccess;
}
intSHA1Result(SHA1Context*c,unsignedcharMessage_Digest[SHA1HashSize])
...{
inti;
if(!
c||!
Message_Digest)
returnshaNull;
if(c->Corrupted)
returnc->Corrupted;
if(!
c->Computed)
...{
SHA1PadMessage(c);
for(i=0;i<64;c->Message_Block[++i]=0)
;
c->Length_Low=0; /**//*andclearlength*/
c->Length_High=0;
c->Computed=1;
}
for(i=0;i Message_Digest[i]=c->Intermediate_Hash[i>>2]>>8*(3-(i&0x03)); returnshaSuccess; } intSHA1Input(SHA1Context*context,constunsignedchar*message_array,unsignedlength) ...{ if(! length) returnshaSuccess; if(! context||! message_array) returnshaNull; if(context->Computed) ...{ context->Corrupted=shaStateError; returnshaStateError; } if(context->Corrupted) returncontext->Corrupted; while(length--&&! context->Corrupted) ...{ context->Message_Block[context->Message_Block_Index++]=(*message_array&0xFF); context->Length_Low+=8; if(context->Length_Low==0) ...{ context->Length_High++; if(context->Length_High==0) ...{ /**//*Messageistoolong*/ context->Corrupted=1; } } if(context->Message_Block_Index==64) SHA1ProcessMessageBlock(context); message_array++; } returnshaSuccess; } voidSHA1ProcessMessageBlock(SHA1Context*context) ...{ constDWORDK[]= ...{0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6}; int t; DWORDtemp; DWORDW[80]; DWORDA,B,C,D,E; /**//* *Initializethefirst16wordsinthearrayW */ for(t=0;t<16;t++) ...{ W[t]=context->Message_Block[t*4]<<24; W[t]|=context->Message_Block[t*4+1]<<16; W[t]|=context->Message_Block[t*4+2]<<8; W[t]|=context->Message_Block[t*4+3]; } for(t=16;t<80;t++) W[t]=SHA1CircularShift(1,W[t-3]^W[t-8]^W[t-14]^W[t-16]); A=context->Intermediate_Hash[0]; B=context->Intermediate_Hash[1]; C=context->Intermediate_Hash[2]; D=context->Intermediate_Hash[3]; E=context->Intermediate_Hash[4]; for(t=0;t<20;t++) ...{ temp=SHA1CircularShift(5,A)+ ((B&C)|((~B)&D))+E+W[t]+K[0]; E=D; D=C; C=SHA1CircularShift(30,B); B=A; A=temp; } for(t=20;t<40;t++) ...{ temp=SHA1CircularShift(5,A)+(B^C^D)+E+W[t]+K[1]; E=D; D=C; C=SHA1CircularShift(30,B); B=A; A=temp; } for(t=40;t<60;t++) ...{ temp=SHA1CircularShift(5,A)+ ((B&C)|(B&D)|(C&D))+E+W[t]+K[2]; E=D; D=C; C=SHA1CircularShift(30,B); B=A; A=temp; } for(t=60;t<80;t++) ...{ temp=SHA1CircularShift(5,A)+(B^C^D)+E+W[t]+K[3]; E=D; D=C; C=SHA1CircularShift(30,B); B=A; A=temp; } context->Intermediate_Hash[0]+=A; context->Intermediate_Hash[1]+=B; context->Intermediate_Hash[2]+=C; context->Intermediate_Hash[3]+=D; context->Intermediate_Hash[4]+=E; context->Message_Block_Index=0; } voidSHA1PadMessage(SHA1Context*context) ...{ if(context->Message_Block_Index>55) ...{ context->Message_Block[context->Message_Block_Index++]=0x80; while(context->Message_Block_Index<64) context->Message_Block[context->Message_Block_Index++]=0; SHA1ProcessMessageBlock(context); while(context->Message_Block_Index<56) context->Message_Block[context->Message_Block_Index++]=0; } else ...{ context->Message_Block[context->Message_Block_Index++]=0x80; while(context->Message_Block_Index<56) context->Message_Block[context->Message_Block_Index++]=0; } /**//* *Storethemessagelengthasthelast8octets */ context->Message_Block[56]=context->Length_High>>24; context->Message_Block[57]=context->Length_High>>16; context->Message_Block[58]=context->Length_High>>8; context->Message_Block[59]=context->Length_High; context->Message_Block[60]=context->Length_Low>>24; context->Message_Block[61]=context->Length_Low>>16; context->Message_Block[62]=context->Length_Low>>8; context->Message_Block[63]=context->Length_Low; SHA1ProcessMessageBlock(context); } //Convert5Bytesto8BytesBase32 void_Sha1toBase32(unsignedchar*out,constunsignedchar*in) ...{ constchar*Table="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; out[0]=Table[((in[0]>>3) )&0x1F]; out[1]=Table[((in[0]<<2)|(in[1]>>6))&0x1F]; out[2]=Table[((in[1]>>1) )&0x1F]; out[3]=Table[((in[1]<<4)|(in[2]>>4))&0x1F]; out[4]=Table[((in[2]<<1)|(in[3]>>7))&0x1F]; out[5]=Table[((in[3]>>2) )&0x1F]; out[6]=Table[((in[3]<<3)|(in[4]>>5))&0x1F]; out[7]=Table[((in[4] ) )&0x1F]; } //Returnabase32representationofasha1hash CStringSha1toBase32(constunsignedchar*Sha1) ...{ charBase32[32]; CStringret; _Sha1toBase32((unsignedchar*)Base32,Sha1); _Sha1toBase32((unsignedchar*)Base32+8,Sha1+5); _Sha1toBase32((unsignedchar*)Base32+16,Sha1+10); _Sha1toBase32((unsignedchar*)Base32+24,Sha1+15); ret=CString(Base32,32); returnret; } CStringGetSHA1String(CStringsSource) ...{ SHA1Contextcontext; unsignedchardigest[20]; CStringsTmp,sRet; SHA1Reset(&context); SHA1Input(&context,(constBYTE*)sSource.GetBuffer(0),sSource.GetLength()); SHA1Result(&context,digest); for(inti=0;i<20;i++)...{ sTmp.Format("%02X",digest[i]); sRet+=sTmp; } returnsRet; } 六、学习总结 本次实验题目比较困难,在编程过程中实现SHA-1算法,由于算法掌握不够熟练最终才得出结果,我的程序一直出错,经过反复修改最终成功,在此过程中我发现我的知识掌握不够,对于编程知识有所欠缺,在学习过程中也遇到了不少问题,需要和同学共同商讨,查询资料才能把问题解决。 在完成作业的过程中我也培养了解决问题的能力,查阅资料是很好的手段,在今后的学习过程中应该继续发扬这些能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 密码学 上机 作业