哈尔滨工业大学__密码学应用与实践课程报告_第1页
哈尔滨工业大学__密码学应用与实践课程报告_第2页
哈尔滨工业大学__密码学应用与实践课程报告_第3页
哈尔滨工业大学__密码学应用与实践课程报告_第4页
哈尔滨工业大学__密码学应用与实践课程报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、Harbin Institute of Technology at vei hai密码学应用与实践课程报告专业:计算机科学与技术班 级: 1004101学 号: 9 姓 名:刘杨题目1. 密码算法原理SHA-1 是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不 可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入 码(称为预映射或信息) ,并把它们转化为长度较短、位数固定的输出序列即散列 值(也称为信息摘要或信息认证代码)的过程。单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如 果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确

2、的 散列值,从而保证了其安全性。SHA将输入流按照每块 512位(64个字节)进行分块,并产生 20 个字节的被称为信息认证代码或信息摘要的输出。该算法输入报文的长度不限,产生的输出是一个 160 位的报文摘要。输入是 按 512 位的分组进行处理的。 SHA-1 是不可逆的、防冲突,并具有良好的雪崩效 应。通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与 发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致 表示

3、明文已被篡改。MAC (信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有 知道这个密码的参与者才能再次计算和验证MAC码的合法性。SHA-1与MD5的比较因为二者均由 MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和 其他特性也是相似,但还有以下几点不同:I对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2X28数量级的操作,而对 SHA-1则是2X60数量级的操作。这样, SHA-1对 强行攻击有更大的强度。I对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,

4、SHA-1显得不易受这样的攻击。I速度:在相同的硬件上, SHA-1的运行速度比 MD5慢。原理参考:设计思想基本设计思想:分而治之所谓“分而治之”,即是把一个复杂的问题简单化为多个核心部件,首先加工各 个独立部件,而后在统一合成,得到想要的结果。具体到本次设计而言,大致可把本次设计分为以下几个部分:1. 输入处理: 包括采用何种输入方式,是“运行后输入” ,还是“运行前预先规定”;在 这里,经过本人认真思考与仔细权衡,终于决定使用“运行前预先规定”, 这是由于对于一个“加密算法验证程序”来说,最重要的不是“灵活界面输 入性”,而是准确性,只要得到正确的结果,就是合格的验证程序,就是好 的;而

5、算错了结果,只追求“灵活的界面输入”,既违背了加密程序的后台 运行本质,有可能引发不必要的错误;因而必当选择“运行前预先规定”, 同时,补充预先知道的正确结果进行对照,用以判断程序性能。2. 数据处理过程:这是SHA-1加密算法的核心,它涉及了整个完整的 SHA-1加密算法,是SHA-1 加密算法的本质体现,也是所有不同 SHA-1 加密算法的交汇处。3. 输出处理:这是人机交互的部分,设置一下问题:(1 ) 输出是否符合人类普遍的认知,如果不符合,这样的软件,将给其 他人带来阅读以及理解上的不便;为此,输出逻辑则显得很重要, 所以本人特别优化了输出的逻辑,多次调整输出行间距,最终找到 合适输

6、出方法。(2)输出能否直接反映出加密算法的正确与否, 所以本人特别输出了 “预 先已知的正确结果”,方便校验与调试。(3)输出反映了版权,如果不在输出方面强调版权,将容易被其他人盗 版,为此,本人特别在输出结果的上下各加了“版权所有者信息”, 用以确保版权安全。4. 函数调用:(1 )函数如何调用,影响这函数的执行效率以及 执行的结果正确与否;为此关于调用顺序,本人修改多次。( 2)函数的优化,优化可以减掉冗余函数,加快效率。5. 错误处理机制:主要使用以避免程序崩溃,并方便调试 以及 用户判断程序故障来用。3. 设计流程图4. 功能实现1. 跨文件调用技术:程序虽然不复杂,但由于需要多个文件

7、相互支持,所以跨文件调用的功能就是最起码应当实现的功能2. 输出控制: 将一连串难以比较的字符,分割成易于识别的字符组。3. 错误校验:(1)输入不合要求以及违规,提示“无法应对,请检查输入是否有误”;(2)无法完成处理过程,提示“无法应对,处理发生异常”;(3)重置过程无法完成,提示“无法完成重置”。4. SHA-1 加密算法的实现:(1)散列算法散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长 度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法 推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导 致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的

8、, 即找不出具有相同散列结果的两条信息。 具有这些特性的散列结果就可 以用于验证信息是否被修改。散列算法,是 SHA-1 的重要构成部分。(2)16 进制转换的输出:SHA1始终把消息当成一个位(bit )字符串来处理。本文中,一个 字(Word)是32位,而一个字节(Byte )是8位。也为的是输出字母 组合,方便观测。5. 版权限制 :为了防止版权被盗用,将版权镶嵌在输出中。5. 总结遇到的问题 1:无法判断加密的正确性。解决方案 1:先加密得到正确的结果, 不仅输出加密结果, 还输出预先准备好的正确结果, 比较即可。遇到的问题 2:重置时出现终止框。解决方案 2:增加错误处理机制,杜绝程

9、序崩溃。遇到问题 3:当测试长用例(比方说“0 个a”) 时,输入不便。解决方案 3:增加重复次数数组,专门存储重复次数,即是说“ 0 个 a” = “a” * “次 数 0”,顺利解决。遇到的问题 4:数据紧密输出,看不清,眼花。解决方案 4:以 2 为单位,分割数据,做到两两输出。6. 源代码*#ifndef _SHA1_H_#define _SHA1_H_#include #ifndef _SHA_enum_#define _SHA_enum_enumshaSuccess = 0,shaNull, /* 空指示参量 */shaInputTooLong, /* 输入数据太长提示 */sha

10、StateError /* called Input after Result - 以输入结果命名之 */;#endif#define SHA1HashSize 20/* 以下这种结构将会控制上下文消息for the SHA-1* hashing operation*/typedef struct SHA1Contextuint32_t Intermediate_HashSHA1HashSize/4; /* Message Digest */uint32_t Length_Low; uint32_t Length_High;/* Message length in bits */ /* Mes

11、sage length in bits */* Index into message block array */ int_least16_t Message_Block_Index;uint8_t Message_Block64; /* 512-bit message blocks */int Computed; /* Is the digest computed */int Corrupted; /* Is the message digest corrupted */ SHA1Context;/* 函数原型*/int SHA1Reset( SHA1Context *);int SHA1I

12、nput( SHA1Context *, const uint8_t *, unsigned int);int SHA1Result( SHA1Context *, uint8_t Message_DigestSHA1HashSize);#endif /*_SHA1_H_*/*#include /* 以下是为 SHA1 向左环形移位宏 之定义*/(word) (32-(bits)/* 局部函数原型 */void SHA1PadMessage(SHA1Context *); /* 定义填充信息指针 */ void SHA1ProcessMessageBlock(SHA1Context *);/*

13、 SHA1Reset* 以下为数据初始化之操作* Parameters: (参数设置)* context: in/out* The context to reset.*/int SHA1Reset(SHA1Context *context)if (!context)return shaNull;context-Length_Low= 0;context-Length_High= 0;context-Message_Block_Index = 0;context-Intermediate_Hash0context-Intermediate_Hash1= 0x;= 0xEFCDAB89;conte

14、xt-Intermediate_Hash2= 0x98BADCFE;context-Intermediate_Hash3 = 0x;context-Intermediate_Hash4 = 0xC3D2E1F0;context-Computed = 0;context-Corrupted = 0; return shaSuccess;/* SHA1Result* 以下为 sha-1 结果描述:* 该算法将会返回一个 160 比特的消息摘要队列* 或者输出计算错误*/ int SHA1Result( SHA1Context *context,uint8_t Message_DigestSHA1H

15、ashSize)int i;if (!context | !Message_Digest)return shaNull;if (context-Corrupted)return context-Corrupted;if (!context-Computed) SHA1PadMessage(context); for(i=0; iMessage_Blocki = 0; context-Length_Low = 0; /* 长度清零 */ context-Length_High = 0;context-Computed = 1;for(i = 0; i Intermediate_Hashi2 8

16、* ( 3 - ( i & 0x03 ) );return shaSuccess;/* 以下为 sha-1 输入描述:*接收单位长度为 8 字节倍数的消息*/int SHA1Input( SHA1Context *context, const uint8_t *message_array, unsigned length)if (!length)return shaSuccess;if (!context | !message_array)return shaNull;if (context-Computed)context-Corrupted = shaStateError; return

17、shaStateError;if (context-Corrupted)return context-Corrupted;while(length- & !context-Corrupted)context-Message_Blockcontext-Message_Block_Index+ = (*message_array & 0xFF);context-Length_Low += 8;if (context-Length_Low = 0) context-Length_High+;if (context-Length_High = 0)/* Message is too long */ c

18、ontext-Corrupted = 1;if (context-Message_Block_Index = 64) SHA1ProcessMessageBlock(context); message_array+;return shaSuccess;/* 以下为 sha-1 消息块描述:* 消息块长度为固定之 512 比特*/void SHA1ProcessMessageBlock(SHA1Context *context)const uint32_t K = /* Constants defined in SHA-1 */0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0

19、xCA62C1D6;int t; /*循环计数 */uint32_ttemp; /*临时缓存 */uint32_tW80;/*字顺序 */uint32_tA, B, C, D, E; /*设置系统磁盘缓存块 */*以下为初始化在 W队列中的头16字数据*/for(t = 0; t Message_Blockt * 4 Message_Blockt * 4 + 1 Message_Blockt * 4 + 2 Message_Blockt * 4 + 3;for(t = 16; t Intermediate_Hash0;B = context-Intermediate_Hash1;C = con

20、text-Intermediate_Hash2;D = context-Intermediate_Hash3;E = context-Intermediate_Hash4;/* 以下为定义算法所用之数学函数及其迭代算法描述 */for(t = 0; t 20; t+)temp = SHA1CircularShift(5,A) +(B & C) | (B) & D) + E + Wt + K0; E = D;D = C;C = SHA1CircularShift(30,B);B = A;A = temp;for(t = 20; t 40; t+)temp = SHA1CircularShift(

21、5,A) + (B A C A D) + E + Wt + K1; 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 + Wt + K2;E = D;D = C;C = SHA1CircularShift(30,B);B = A;A = temp;for(t = 60; t Intermediate_Hash0 += A; context-Intermediate_Ha

22、sh1 += B; context-Intermediate_Hash2 += C; context-Intermediate_Hash3 += D; context-Intermediate_Hash4 += E;context-Message_Block_Index = 0; /* SHA1PadMessage* 数据填充模块*/void SHA1PadMessage(SHA1Context *context)if (context-Message_Block_Index 55)context-Message_Blockcontext-Message_Block_Index+ = 0x80

23、; while(context-Message_Block_Index Message_Blockcontext-Message_Block_Index+SHA1ProcessMessageBlock(context);while(context-Message_Block_Index Message_Blockcontext-Message_Block_Index+elsecontext-Message_Blockcontext-Message_Block_Index+ = 0x80; while(context-Message_Block_Index Message_Blockcontex

24、t-Message_Block_Index+/* 把最后 64 位保存为数据长度*/context-Message_Block56 = context-Length_High 24;context-Message_Block57 = context-Length_High 16;context-Message_Block58 = context-Length_High 8;context-Message_Block59 = context-Length_High;context-Message_Block60 = context-Length_Low 24;context-Message_Bl

25、ock61 = context-Length_Low 16;context-Message_Block62 = context-Length_Low 8;context-Message_Block63 = context-Length_Low;= 0;= 0;= 0;SHA1ProcessMessageBlock(context);*#ifndef_STDINT_H#define_STDINT_H#define_need_wint_t#define_need_wchar_t#include/* Exact-width integer types */ typedef signed char i

26、nt8_t; typedef unsigned char uint8_t; typedef short int16_t;typedef unsigned short uint16_t; typedef int int32_t;typedef unsigned uint32_t; typedef long int64_t;typedef unsigned long uint64_t;/* Minimum-width integer types */ typedef signed char int_least8_t; typedef unsigned char uint_least8_t; typ

27、edef short int_least16_t; typedef unsigned short uint_least16_t; typedef int int_least32_t; typedef unsigned uint_least32_t; typedef long int_least64_t; typedef unsigned long uint_least64_t;/* Fastest minimum-width integer typesalland* Not actually guaranteed to be fastest for purposes* Here we use

28、the exact-width types for 8 16-bit ints.*/typedef char int_fast8_t;typedef unsigned char uint_fast8_t;typedef short int_fast16_t;typedef unsigned short uint_fast16_t; typedef int int_fast32_t;typedef unsigned int uint_fast32_t;typedef long int_fast64_t;typedef unsigned long uint_fast64_t;/* Integer

29、types capable of holding object pointers */typedef int intptr_t; typedef unsigned uintptr_t;/* Greatest-width integer types */ typedef long intmax_t;typedef unsigned long uintmax_t;| defined/* Limits of specified-width integer types */ #if !defined (_cplusplus)(_STDC_LIMIT_MACROS)/* Limits of exact-

30、width integer types */#defineINT8_MIN (-128)#defineINT16_MIN(-32768)#defineINT32_MIN(-47 - 1)#defineINT64_MIN(-807LL -1)#defineINT8_MAX127#defineINT16_MAX32767#defineINT32_MAX47#defineINT64_MAX807LL#defineUINT8_MAX0xff /* 255U */#defineUINT16_MAX 0xffff /*65535U */#defineUINT32_MAX 0xffffffff/* 95U

31、*/#defineUINT64_MAX 0xffffffffffffffffULL /* 9551615ULL */* Limits of minimum-width integer types */#defineINT_LEAST8_MININT8_MIN#defineINT_LEAST16_MININT16_MIN#defineINT_LEAST32_MININT32_MIN#defineINT_LEAST64_MININT64_MIN#defineINT_LEAST8_MAXINT8_MAX#defineINT_LEAST16_MAX INT16_MAX#defineINT_LEAST3

32、2_MAX INT32_MAX#defineINT_LEAST64_MAX INT64_MAX#defineUINT_LEAST8_MAX UINT8_MAX#defineUINT_LEAST16_MAX UINT16_MAX#defineUINT_LEAST32_MAX UINT32_MAX#defineUINT_LEAST64_MAX UINT64_MAX/* Limits of fastest minimum-width integer types */#defineINT_FAST8_MIN INT8_MIN#defineINT_FAST16_MIN INT16_MIN#defineI

33、NT_FAST32_MIN INT32_MIN#defineINT_FAST64_MIN INT64_MIN#defineINT_FAST8_MAX INT8_MAX#defineINT_FAST16_MAX INT16_MAX#defineINT_FAST32_MAX INT32_MAX#defineINT_FAST64_MAX INT64_MAX#defineUINT_FAST8_MAX UINT8_MAX#defineUINT_FAST16_MAX UINT16_MAX#defineUINT_FAST32_MAX UINT32_MAX#defineUINT_FAST64_MAX UINT

34、64_MAX/* Limits of integer types capable of holding object pointers */#defineINTPTR_MIN INT32_MIN#defineINTPTR_MAX INT32_MAX#defineUINTPTR_MAX UINT32_MAX/* Limits of greatest-width integer types */#defineINTMAX_MIN INT64_MIN#defineINTMAX_MAX INT64_MAX#defineUINTMAX_MAX UINT64_MAX/* Limits of other i

35、nteger types */#definePTRDIFF_MIN INT32_MIN#definePTRDIFF_MAX INT32_MAX#define SIG_ATOMIC_MIN INT32_MIN#define SIG_ATOMIC_MAX INT32_MAX#define SIZE_MAX UINT32_MAX#ifndef WCHAR_MIN /* also in */#define WCHAR_MIN 0#define WCHAR_MAX 0xffff /* UINT16_MAX */ #endif/* wint_t is unsigned short for compatib

36、ility with MS runtime*/#define WINT_MIN 0#define WINT_MAX 0xffff /* UINT16_MAX */#endif /* !definedcplusplus) | definedSTDC_LIMIT_MACROS */* Macros for integer constants */#if !defined (_cplusplus)| defined(_STDC_CONSTANT_MACROS)/* Macros for minimum-width integer constantsAccoding to Douglas Gwyn :

37、This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC9899:1999 as initially published, the expansion was requiredto be an integer constant of precisely matching type,whichis impossible to accomplish for the shorter types onmostplatforms, because C99 provides no standard way to designatean integ

38、er constant with width less than that of type int.TC1 changed this to require just an integer constant *expression* with *promoted* type. */ #define INT8_C(val) (int8_t) + (val)#define UINT8_C(val) (uint8_t) + (val#U)#define INT16_C(val) (int16_t) + (val) #define UINT16_C(val) (uint16_t) + (val#U) #

39、define INT32_C(val) val#L#define UINT32_C(val) val#UL#define INT64_C(val) val#LL#define UINT64_C(val) val#ULL/* Macros for greatest-width integer constants */ #define INTMAX_C(val) INT64_C(val) #define UINTMAX_C(val) UINT64_C(val)#endif/* !defined(_cplusplus)| definedSTDC_CONSTANT_MACROS */ #endif*#

40、include #include #include /* 定义测试模式*/#define TEST1 abc /*#include 只有一个分组 - 共有 24 位长度需要填充一个 1 和 423 个 0 最后两个字 00000000 00000018 表明原始消息长度是 24 位*/#define TEST2a abcdbcdecdefdefgefghfghighijhi#define TEST2b jkijkljklmklmnlmnomnopnopq#define TEST2 TEST2a TEST2b /*0*000001c0 结束*分组组成*/#define TEST3 a /* 1,000,000#define TEST4a 067067#define TEST4b 067067/* an exact multiple of 512 bi

温馨提示

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

评论

0/150

提交评论