哈爾濱工業大學(威海)__密碼學應用與實踐課程報告_第1頁
哈爾濱工業大學(威海)__密碼學應用與實踐課程報告_第2頁
哈爾濱工業大學(威海)__密碼學應用與實踐課程報告_第3頁
哈爾濱工業大學(威海)__密碼學應用與實踐課程報告_第4頁
哈爾濱工業大學(威海)__密碼學應用與實踐課程報告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Harbin Institute of Technology at Weihai密碼學應用與實踐課程報告專 業: 計算機科學與技術 班 級: 1004101 學 號: 100410129 姓 名: 劉楊 題目1.密碼算法原理SHA-1是一種數據加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。單向散列函數的安全性在于其產生散列值的操作過程具有較強的單向性。如果在輸入序列中嵌入密碼,那么任何人在不知道密碼的情況下都

2、不能產生正確的散列值,從而保證了其安全性。SHA將輸入流按照每塊512位(64個字節)進行分塊,并產生20個字節的被稱為信息認證代碼或信息摘要的輸出。該算法輸入報文的長度不限,產生的輸出是一個160位的報文摘要。輸入是按512 位的分組進行處理的。SHA-1是不可逆的、防沖突,并具有良好的雪崩效應。通過散列算法可實現數字簽名實現,數字簽名的原理是將要傳送的明文通過一種函數運算(Hash)轉換成報文摘要(不同的明文對應不同的報文摘要),報文摘要加密后與明文一起傳送給接受方,接受方將接受的明文產生新的報文摘要與發送方的發來報文摘要解密比較,比較結果一致表示明文未被改動,如果不一致表示明文已被篡改。

3、MAC (信息認證代碼)就是一個散列結果,其中部分輸入信息是密碼,只有知道這個密碼的參與者才能再次計算和驗證MAC碼的合法性。SHA-1與MD5的比較因為二者均由MD4導出,SHA-1和MD5彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:l 對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等于給定報摘要的難度對MD5是2128數量級的操作,而對SHA-1則是2160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。l 對密碼分析的安全性:由于MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這

4、樣的攻擊。l 速度:在相同的硬件上,SHA-1的運行速度比MD5慢。原理參考:2.設計思想基本設計思想:分而治之所謂“分而治之”,即是把一個復雜的問題簡單化為多個核心部件,首先加工各個獨立部件,而后在統一合成,得到想要的結果。具體到本次設計而言,大致可把本次設計分為以下幾個部分:輸入處理:包括采用何種輸入方式,是“運行后輸入”,還是“運行前預先規定”;在這里,經過本人認真思考與仔細權衡,終于決定使用“運行前預先規定”,這是由于對于一個“加密算法驗證程序”來說,最重要的不是“靈活界面輸入性”,而是準確性,只要得到正確的結果,就是合格的驗證程序,就是好的;而算錯了結果,只追求“靈活的界面輸入”,既

5、違背了加密程序的后臺運行本質,有可能引發不必要的錯誤;因而必當選擇“運行前預先規定”,同時,補充預先知道的正確結果進行對照,用以判斷程序性能。數據處理過程:這是SHA-1加密算法的核心,它涉及了整個完整的SHA-1加密算法,是SHA-1加密算法的本質體現,也是所有不同SHA-1加密算法的交匯處。輸出處理:這是人機交互的部分,設置一下問題:輸出是否符合人類普遍的認知,如果不符合,這樣的軟件,將給其他人帶來閱讀以及理解上的不便;為此,輸出邏輯則顯得很重要,所以本人特別優化了輸出的邏輯,多次調整輸出行間距,最終找到合適輸出方法。輸出能否直接反映出加密算法的正確與否,所以本人特別輸出了“預先已知的正確

6、結果”,方便校驗與調試。輸出反映了版權,如果不在輸出方面強調版權,將容易被其他人盜版,為此,本人特別在輸出結果的上下各加了“版權所有者信息”,用以確保版權安全。函數調用:(1)函數如何調用,影響這函數的執行效率 以及 執行的結果正確與否;為此關于調用順序,本人修改多次。(2)函數的優化,優化可以減掉冗余函數,加快效率。5. 錯誤處理機制:主要使用以避免程序崩潰,并方便調試 以及 用戶判斷程序故障來用。流程圖功能實現1. 跨文件調用技術:程序雖然不復雜,但由于需要多個文件相互支持,所以跨文件調用的功能就是最起碼應當實現的功能2. 輸出控制:將一連串難以比較的字符,分割成易于識別的字符組。3. 錯

7、誤校驗:(1)輸入不合要求以及違規,提示“無法應對,請檢查輸入是否有誤”;(2)無法完成處理過程,提示“無法應對,處理發生異常”;(3)重置過程無法完成,提示“無法完成重置”。4. SHA-1加密算法的實現:(1)散列算法散列是信息的提煉,通常其長度要比信息小得多,且為一個固定長度。加密性強的散列一定是不可逆的,這就意味著通過散列結果,無法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導致散列結果的明顯變化,這稱之為雪崩效應。散列還應該是防沖突的,即找不出具有相同散列結果的兩條信息。具有這些特性的散列結果就可以用于驗證信息是否被修改。散列算法,是SHA-1的重要構成部分。(2)1

8、6進制轉換的輸出:SHA1始終把消息當成一個位(bit)字符串來處理。本文中,一個字(Word)是32位,而一個字節(Byte)是8位。也為的是輸出字母組合,方便觀測。版權限制:為了防止版權被盜用,將版權鑲嵌在輸出中。5.總結遇到的問題1:無法判斷加密的正確性。解決方案1: 先加密得到正確的結果,不僅輸出加密結果,還輸出預先準備好的正確結果,比較即可。遇到的問題2:重置時出現終止框。解決方案2:增加錯誤處理機制,杜絕程序崩潰。遇到問題3:當測試 長用例(比方說“100000000個a”) 時,輸入不便。解決方案3:增加重復次數數組,專門存儲重復次數,即是說“100000000個a” = “a”

9、 * “次數100000000”,順利解決。遇到的問題4:數據緊密輸出,看不清,眼花。解決方案4:以2為單位,分割數據,做到兩兩輸出。6.源代碼Sha1.h*#ifndef _SHA1_H_#define _SHA1_H_#include TypeRedef.h#ifndef _SHA_enum_#define _SHA_enum_enum shaSuccess = 0, shaNull, /* 空指示參量 */ shaInputTooLong, /* 輸入數據太長提示 */ shaStateError /* called Input after Result -以輸入結果命名之 */;#en

10、dif#define SHA1HashSize 20/* * 以下這種結構將會控制上下文消息 for the SHA-1 * hashing operation */typedef struct SHA1Context uint32_t Intermediate_HashSHA1HashSize/4; /* Message Digest */ uint32_t Length_Low; /* Message length in bits */ uint32_t Length_High; /* Message length in bits */ /* Index into message bloc

11、k 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 SHA1Input( SHA1Context *, const uint8_t *, u

12、nsigned int);int SHA1Result( SHA1Context *, uint8_t Message_DigestSHA1HashSize);#endif /*_SHA1_H_*/Sha1.c*#include Sha1.h/* * 以下是為 SHA1 向左環形移位宏 之定義 */#define SHA1CircularShift(bits,word) (word) (32-(bits)/* 局部函數原型 */void SHA1PadMessage(SHA1Context *); /* 定義填充信息指針 */void SHA1ProcessMessageBlock(SHA1C

13、ontext *);/* * 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_Hash0 = 0 x67452301; con

14、text-Intermediate_Hash1 = 0 xEFCDAB89; context-Intermediate_Hash2 = 0 x98BADCFE; context-Intermediate_Hash3 = 0 x10325476; context-Intermediate_Hash4 = 0 xC3D2E1F0; context-Computed = 0; context-Corrupted = 0; return shaSuccess;/* * SHA1Result * * 以下為sha-1結果描述: *: * 該算法將會返回一個160比特的消息摘要隊列 * * 或者輸出計算錯

15、誤 * */int SHA1Result( SHA1Context *context, uint8_t Message_DigestSHA1HashSize) 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; /* 長度清零 */ con

16、text-Length_High = 0; context-Computed = 1; for(i = 0; i Intermediate_Hashi2 8 * ( 3 - ( i & 0 x03 ) ); return shaSuccess;/* * 以下為sha-1輸入描述: * * 接收單位長度為8字節倍數的消息 * */int SHA1Input( SHA1Context *context, const uint8_t *message_array, unsigned length) if (!length) return shaSuccess; if (!context | !mes

17、sage_array) return shaNull; if (context-Computed) context-Corrupted = shaStateError; return shaStateError; if (context-Corrupted) return context-Corrupted; while(length- & !context-Corrupted) context-Message_Blockcontext-Message_Block_Index+ = (*message_array & 0 xFF); context-Length_Low += 8; if (c

18、ontext-Length_Low = 0) context-Length_High+; if (context-Length_High = 0) /* Message is too long */ context-Corrupted = 1; if (context-Message_Block_Index = 64) SHA1ProcessMessageBlock(context); message_array+; return shaSuccess;/* * 以下為sha-1消息塊描述: * * 消息塊長度為固定之512比特 * */void SHA1ProcessMessageBlock

19、(SHA1Context *context) const uint32_t K = /* Constants defined in SHA-1 */ 0 x5A827999, 0 x6ED9EBA1, 0 x8F1BBCDC, 0 xCA62C1D6 ; int t; /* 循環計數 */ uint32_t temp; /* 臨時緩存 */ uint32_t W80; /* 字順序 */ uint32_t A, B, C, D, E; /* 設置系統磁盤緩存塊 */ /* * 以下為初始化在W隊列中的頭16字數據 */ for(t = 0; t Message_Blockt * 4 Messa

20、ge_Blockt * 4 + 1 Message_Blockt * 4 + 2 Message_Blockt * 4 + 3; for(t = 16; t Intermediate_Hash0; B = context-Intermediate_Hash1; C = context-Intermediate_Hash2; D = context-Intermediate_Hash3; E = context-Intermediate_Hash4; /* * 以下為定義算法所用之數學函數及其迭代算法描述 */ for(t = 0; t 20; t+) temp = SHA1CircularSh

21、ift(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(5,A) + (B C 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 &

22、 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_Hash1 += B; context-Intermediate_Hash2 += C; context-Intermediate_Hash3 += D; context-Intermediate_Hash4 += E; context-Message_Block_Index =

23、0;/* * SHA1PadMessage * 數據填充模塊 */void SHA1PadMessage(SHA1Context *context) if (context-Message_Block_Index 55) context-Message_Blockcontext-Message_Block_Index+ = 0 x80; while(context-Message_Block_Index Message_Blockcontext-Message_Block_Index+ = 0; SHA1ProcessMessageBlock(context); while(context-M

24、essage_Block_Index Message_Blockcontext-Message_Block_Index+ = 0; else context-Message_Blockcontext-Message_Block_Index+ = 0 x80; while(context-Message_Block_Index Message_Blockcontext-Message_Block_Index+ = 0; /* * 把最后64位保存為數據長度 */ context-Message_Block56 = context-Length_High 24; context-Message_B

25、lock57 = 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_Block61 = context-Length_Low 16; context-Message_Block62 = context-Length_Low 8; context-Message_Block63 =

26、 context-Length_Low; SHA1ProcessMessageBlock(context);TypeRedef.h*#ifndef _STDINT_H #define _STDINT_H #define _need_wint_t #define _need_wchar_t #include /* 7.18.1.1 Exact-width integer types */ typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short

27、uint16_t; typedef int int32_t; typedef unsigned uint32_t; typedef long int64_t; typedef unsigned long uint64_t; /* 7.18.1.2 Minimum-width integer types */ typedef signed char int_least8_t; typedef unsigned char uint_least8_t; typedef short int_least16_t; typedef unsigned short uint_least16_t; typede

28、f int int_least32_t; typedef unsigned uint_least32_t; typedef long int_least64_t; typedef unsigned long uint_least64_t; /* 7.18.1.3 Fastest minimum-width integer types * Not actually guaranteed to be fastest for all purposes * Here we use the exact-width types for 8 and 16-bit ints. */ typedef char

29、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; /* 7.18.1.4 Integer types capable of holding object pointer

30、s */ typedef int intptr_t; typedef unsigned uintptr_t; /* 7.18.1.5 Greatest-width integer types */ typedef long intmax_t; typedef unsigned long uintmax_t; /* 7.18.2 Limits of specified-width integer types */ #if !defined ( _cplusplus) | defined (_STDC_LIMIT_MACROS) /* 7.18.2.1 Limits of exact-width

31、integer types */ #define INT8_MIN (-128) #define INT16_MIN (-32768) #define INT32_MIN (-2147483647 - 1) #define INT64_MIN (-9223372036854775807LL - 1) #define INT8_MAX 127 #define INT16_MAX 32767 #define INT32_MAX 2147483647 #define INT64_MAX 9223372036854775807LL #define UINT8_MAX 0 xff /* 255U */

32、#define UINT16_MAX 0 xffff /* 65535U */ #define UINT32_MAX 0 xffffffff /* 4294967295U */ /* 7.18.2.2 Limits of minimum-width integer types */ #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST8_MAX I

33、NT8_MAX #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX /* 7.18.2.3 Limits of fastest minimum-width inte

34、ger types */ #define INT_FAST8_MIN INT8_MIN #define INT_FAST16_MIN INT16_MIN #define INT_FAST32_MIN INT32_MIN #define INT_FAST64_MIN INT64_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT

35、8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX /* 7.18.2.4 Limits of integer types capable of holding object pointers */ #define INTPTR_MIN INT32_MIN #define INTPTR_MAX INT32_MAX #define UINTPTR_MAX UINT32_MAX /* 7.18.2.5 Limits of grea

36、test-width integer types */ #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX /* 7.18.3 Limits of other integer types */ #define PTRDIFF_MIN INT32_MIN #define PTRDIFF_MAX INT32_MAX #define SIG_ATOMIC_MIN INT32_MIN #define SIG_ATOMIC_MAX INT32_MAX #define SIZE_M

37、AX UINT32_MAX #ifndef WCHAR_MIN /* also in wchar.h */ #define WCHAR_MIN 0 #define WCHAR_MAX 0 xffff /* UINT16_MAX */ #endif /* * wint_t is unsigned short for compatibility with MS runtime */ #define WINT_MIN 0 #define WINT_MAX 0 xffff /* UINT16_MAX */ #endif /* !defined ( _cplusplus) | defined _STDC

38、_LIMIT_MACROS */ /* 7.18.4 Macros for integer constants */ #if !defined ( _cplusplus) | defined (_STDC_CONSTANT_MACROS) /* 7.18.4.1 Macros for minimum-width integer constants Accoding to Douglas Gwyn : This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC 9899:1999 as initially published, the e

39、xpansion was required to be an integer constant of precisely matching type, which is impossible to accomplish for the shorter types on most platforms, because C99 provides no standard way to designate an integer constant with width less than that of type int. TC1 changed this to require just an inte

40、ger 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) #define INT32_C(val) val#L #define UINT32_C(val) val#UL #define INT64_C(val) val#LL #defi

41、ne UINT64_C(val) val#ULL /* 7.18.4.2 Macros for greatest-width integer constants */ #define INTMAX_C(val) INT64_C(val) #define UINTMAX_C(val) UINT64_C(val) #endif /* !defined ( _cplusplus) | defined _STDC_CONSTANT_MACROS */ #endif*#include #include #include TypeRedef.h#include Sha1.h/* * 定義測試模式 */#define TEST1 abc /* 只有一個分組-共有24位長度 * 需要填充一個1和423個0 * 最后兩個字00000000 00000018表明原始消息長度是24位 */ #define TEST2a abcdbcdecdefdefgefghfghighijhi#define TEST2b jkijkljklmklmnlmnomnopnopq #define TEST2 TEST2a TEST2b /* 消息M是448位之ASCII碼串 * 該消息被填充一個1,后跟511個0 * 并且以十六進制00000

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論