日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息摘要算法之三:SHA256算法分析与实现

發(fā)布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息摘要算法之三:SHA256算法分析与实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面一篇中我們分析了SHA的原理,并且以SHA1為例實現(xiàn)了相關(guān)的算法,在這一片中我們將進一步分析SHA2并實現(xiàn)之。

1、SHA簡述

前面的篇章中我們已經(jīng)說明過,SHA實際包括有一系列算法,分別是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。而我們所說的SHA2實際是對后面4中的統(tǒng)稱。各種SHA算法的數(shù)據(jù)比較如下表,其中的長度單位均為位:

類別

SHA-1

SHA-224

SHA-256

SHA-384

SHA-512

消息摘要長度

160

224

256

384

512

消息長度

小于 位

小于 位

小于 位

小于 位

小于 位

分組長度

512

512

512

1024

1024

計算字長度

32

32

32

64

64

計算步驟數(shù)

80

64

64

80

80

從上表中我們不難發(fā)現(xiàn),SHA-224和SHA-256、SHA-384和SHA-512在消息長度、分組長度、計算字長以及計算步驟各方面分別都是一致的。事實上通常認為SHA-224是SHA-256的縮減版,而SHA-384是SHA-512的縮減版。所以在接下來的討論中,我們把SHA-224和SHA-256作為一組,而把SHA-384和SHA-512作為另一組來討論。在這一篇我們先來分析和實現(xiàn)SHA-224和SHA-256算法。

2、消息的填充與解析

在這里我們討論的散列函數(shù)用于在計算機中將根據(jù)作為輸入消息或者數(shù)據(jù)文件生成其對應(yīng)的信息摘要。消息或數(shù)據(jù)文件通常被作為是位字符串。消息的長度是消息中的比特數(shù)(空消息的長度為0)。如果消息中的比特數(shù)是8的倍數(shù),那么我們就可以用十六進制來表示消息的緊湊性。消息填充的目的是為了在消息填充后,在SHA-224和SHA-256中消息的長度正好是512位的整數(shù)倍。

接下來我們說明消息或者數(shù)據(jù)文件將如何實現(xiàn)填充。總的來說就是,先添加一個“1”,再后跟多個“0”,然后再追加一個64位的消息長度信息,使得填充完成后的消息長度正好是512位的整數(shù)倍。追加的64位的消息長度信息是原始消息的位長,填充完成的消息會被分成512位的消息分組。

對于SHA-224和SHA-256來說消息的最大長度L<264,在對消息進行散列運算之前需要對消息做相應(yīng)的填充處理。

首先,在原始信息之后填充一個“1”,例如:如果原始信息是"01010000",完成這一填充之后就是"010100001"。

接下來,在完成上一步填充后,在其后面需天充一定數(shù)量的“0”,數(shù)量記為K,則K的取值必須是滿足下述表達式的最小非負整數(shù)值。

( L + 1 + K ) mod 512 =448

最后,在填充完必的消息后,追加64位的原始消息長度,因為消息的長度不會超過264位,所以其長度數(shù)據(jù)的值不會超過64位。填充完畢后,所有的消息分組都將是一個512位。

3、迭代函數(shù)與常數(shù)

SHA算法這類散列算法的計算過程都需要用到邏輯函數(shù)和計算常量。但由于具體算法的不同所使用的具體的函數(shù)和常數(shù)略有差別。我們在前面的篇章中說過MD5和SHA1,它們都有4個邏輯函數(shù),而在SHA2的一系列算法中都采用了6個邏輯函數(shù)。接下來將說明SHA-224和SHA-256的邏輯函數(shù)和常量。

SHA-224和SHA-256采用6個邏輯函數(shù),每個函數(shù)均基于32位字運算,這些輸入的32位字我們記為x、y、z,同樣的這些函數(shù)的計算結(jié)果也是一個32位字。這些邏輯函數(shù)表示如下:

????????CH( x, y, z) = (x AND y)XOR ( (NOT x) AND z)

????????MAJ( x, y, z) = (x AND y)XOR (x AND z) XOR (y AND z)

????????BSIG0(x) = ROTR^2(x) XORROTR^13(x) XOR ROTR^22(x)

????????BSIG1(x) = ROTR^6(x) XORROTR^11(x) XOR ROTR^25(x)

????????SSIG0(x) = ROTR^7(x) XORROTR^18(x) XOR SHR^3(x)

????????SSIG1(x) = ROTR^17(x) XORROTR^19(x) XOR SHR^10(x)

SHA-224和SHA-256采用相同的,64個32位的常數(shù)序列。通常記為:K0、K1、……、K63,這些常數(shù)的取值是前64個質(zhì)數(shù)的立方根的小數(shù)部分的前32位。這些數(shù)以16進制表示如下:

????????428a2f98 71374491 b5c0fbcf e9b5dba5 3956c25b 59f111f1 923f82a4 ab1c5ed5

????????d807aa98 12835b01 243185be 550c7dc3 72be5d74 80deb1fe 9bdc06a7 c19bf174

????????e49b69c1 efbe4786 0fc19dc6 240ca1cc 2de92c6f 4a7484aa 5cb0a9dc 76f988da

????????983e5152 a831c66d b00327c8 bf597fc7 c6e00bf3 d5a79147 06ca6351 14292967

????????27b70a85 2e1b2138 4d2c6dfc 53380d13 650a7354 766a0abb 81c2c92e 92722c85

????????a2bfe8a1 a81a664b c24b8b70 c76c51a3 d192e819 d6990624 f40e3585 106aa070

????????19a4c116 1e376c08 2748774c 34b0bcb5 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3

????????748f82ee 78a5636f 84c87814 8cc70208 90befffa a4506ceb bef9a3f7 c67178f2

4、計算過程

前面,我們已經(jīng)介紹了消息的預(yù)處理及散列邏輯函數(shù),接下來我們將說明摘要的計算過程。

每個安全散列函數(shù)的輸出,在應(yīng)用到一個分為N個分組的消息后,結(jié)果記為散列量H(N)。對于SHA-224和SHA-256,H(i)可以被認為是8個32位的字,記為:H(i)0、H(i)1、…、H(i)7。

散列字被初始化為一個特定的值,并在處理完每一個消息分組后對它進行更新,并在處理最后一個塊后將其連接起來以產(chǎn)生輸出。對于SHA-256,所有的H(N)變量都是串聯(lián)的,而SHA-224散列值是通過最后連接時,省略一些而產(chǎn)生的。

接下來我們說明一下SHA-224和SHA-256的計算過程。首先初始化鏈接變量。對于SHA-224來說,初始散列值H(0)由以下8個32位的十六進制數(shù)組成:

????????H(0)0 = c1059ed8

????????H(0)1 = 367cd507

????????H(0)2 = 3070dd17

????????H(0)3 = f70e5939

????????H(0)4 = ffc00b31

????????H(0)5 = 68581511

????????H(0)6 = 64f98fa7

????????H(0)7 = befa4fa4

而對于SHA-256來說,初始散列值H(0)由以下8個32位的十六進制數(shù)組成。這些字由前8個質(zhì)數(shù)的平方根的小數(shù)部分的錢32位組成。

????????H(0)0 = 6a09e667

????????H(0)1 = bb67ae85

????????H(0)2 = 3c6ef372

????????H(0)3 = a54ff53a

????????H(0)4 = 510e527f

????????H(0)5 = 9b05688c

????????H(0)6 = 1f83d9ab

????????H(0)7 = 5be0cd19

接下來我們描述一下摘要計算,SHA-224和SHA-256在消息分組執(zhí)行相同的處理,只在初始化H(0)和如何生成最終輸出的過程中有所不同。SHA-224和SHA-256可以用來散列處理長度為L位的消息,其中0 < L< =264。算法使用一個64個32位字的消息列表, 8個工作變量32位以及8個32位字的散列值。

消息列表每32位分為一個子分組,被標記為W0、W1、…、W63。8個工作變量分別為a、b、c、d、e、f、g和h,8個散列值被標記為h(i)0、h(i)1、…、H(i)7,并保留初始散列值H(0),替換為每一個連續(xù)的中間散列值(在處理完每個消息分組后) H(i),并以最終的散列值H(N)結(jié)束,在處理完所有N塊后。它們還使用兩個臨時變量T1和T2。

從前面我們知道,填充完了之后消息被分為了512位的消息分組。每個分組被分為16個32位的子分組,記為:M(i)0、M(i)1、...、M(i)15。將對N個消息分組進行如下操作。

a、64個消息列表的生成

????????從?t = 0 到 15 —— Wt = M(i)t

????????從t = 16 t到 63 ——?Wt =SSIG1(W(t-2)) + W(t-7) + SSIG0(w(t-15)) + W(t-16)

b、初始化工作變量

????????a = H(i-1)0

????????b = H(i-1)1

????????c = H(i-1)2

????????d = H(i-1)3

????????e = H(i-1)4

????????f = H(i-1)5

????????g = H(i-1)6

????????h = H(i-1)7

c、執(zhí)行散列計算

????????從 t = 0 到 63 :

????????????????T1 = h +BSIG1(e) + CH(e,f,g) + Kt + Wt

? ??????????? ??T2 = BSIG0(a)+ MAJ(a,b,c)

? ??????????? ??h = g

? ??????????? ??g = f

? ??????????? ??f = e

? ??????????? ??e = d + T1

? ??????????? ??d = c

? ??????????? ??c = b

? ??????????? ??b = a

? ??????????? ??a = T1 + T2

d、計算中間散列值

????????H(i)0 = a + H(i-1)0

????????H(i)1 = b + H(i-1)1

????????H(i)2 = c + H(i-1)2

????????H(i)3 = d + H(i-1)3

????????H(i)4 = e + H(i-1)4

????????H(i)5 = f + H(i-1)5

????????H(i)6 = g + H(i-1)6

????????H(i)7 = h + H(i-1)7

在對所有消息分組完成上述計算之后,計算最終輸出。對于SHA-256,是所有H(N)0、H(N)1到H(N)7的串聯(lián)。對于SHA-224,則是H(N)0、H(N)1直到H(N)6的串聯(lián)。

5、代碼實現(xiàn)

前面我們已經(jīng)說明了SHA-256(SHA-224)的計算過程,接下來我們將這一過程代碼化。同樣的首先定義一個上下文的結(jié)構(gòu)。

/** 定義SHA-256哈希操作的內(nèi)容信息結(jié)構(gòu)體 */ typedef struct SHA256Context {uint32_tIntermediate_Hash[SHA256HashSize/4]; /* 信息摘要 */uint32_t Length_High;??????????? ?????????????/* 按位計算的信息長度高字 */uint32_t Length_Low;????????????????????????? /* 按位計算的信息長度低字 */int_least16_tMessage_Block_Index;??????????? /* 信息分組數(shù)組的索引 */uint8_tMessage_Block[SHA256_Message_Block_Size];/* 512位信息分組 */int Computed;????????????? ???????????????????/* 摘要計算標識 */int Corrupted;??????????????????????????????? /* 信息摘要損壞標識 */ } SHA256Context;

接下來實現(xiàn)SHA256Context結(jié)構(gòu)的初始化,為后續(xù)的計算過程做準備。

static SHAStatusCode SHA224_256Reset(SHA256Context *context, uint32_t *H0) {if (!context) return shaNull;context->Length_High =context->Length_Low = 0;context->Message_Block_Index = 0;context->Intermediate_Hash[0] = H0[0];context->Intermediate_Hash[1] = H0[1];context->Intermediate_Hash[2] = H0[2];context->Intermediate_Hash[3] = H0[3];context->Intermediate_Hash[4] = H0[4];context->Intermediate_Hash[5] = H0[5];context->Intermediate_Hash[6] = H0[6];context->Intermediate_Hash[7] = H0[7];context->Computed = 0;context->Corrupted = shaSuccess;return shaSuccess; }

接下來實現(xiàn)信息分組的輸入,這個函數(shù)接受一個字節(jié)數(shù)組作為下一個消息分組以便進行處理。

SHAStatusCode SHA256Input(SHA256Context *context, const uint8_t *message_array,unsigned intlength) {if (!context) return shaNull;if (!length) return shaSuccess;if (!message_array) return shaNull;if (context->Computed) returncontext->Corrupted = shaStateError;if (context->Corrupted) returncontext->Corrupted;while (length--){context->Message_Block[context->Message_Block_Index++]=*message_array;if ((SHA224_256AddLength(context, 8) ==shaSuccess) &&(context->Message_Block_Index ==SHA256_Message_Block_Size))SHA224_256ProcessMessageBlock(context);message_array++;}return context->Corrupted; }

當然還需要一個消息處理及最終摘要輸出的函數(shù),這個函數(shù)將返回一個224位或者256位的信息摘要到調(diào)用者給定的Message_Digest數(shù)組。返回的信息摘要,第一個元素索引為0,最后一個元素索引為27(SHA-2244)或者31(SHA-256)。

static SHAStatusCode SHA224_256ResultN(SHA256Context *context,uint8_t Message_Digest[], int HashSize) {int i;if (!context) return shaNull;if (!Message_Digest) return shaNull;if (context->Corrupted) returncontext->Corrupted;if (!context->Computed)SHA224_256Finalize(context, 0x80);for (i = 0; i < HashSize; ++i)Message_Digest[i] =(uint8_t)(context->Intermediate_Hash[i>>2] >> 8 * ( 3 - ( i& 0x03 ) ));return shaSuccess; }

至此我們就完成了SHA-256(SHA-224)的編碼,在后續(xù)我們將對這一編碼進行驗證。

6、結(jié)論

上一節(jié)我們實現(xiàn)了SHA-256(SHA-224)的編碼,接下來我們來對這一實現(xiàn)進行驗證。我們輸入明文“abcd”并輸出結(jié)果:

同時我們對比一下其他工具生成的“abcd”的SHA-256的信息摘要結(jié)果如下:

對比上述兩個結(jié)果,我們發(fā)現(xiàn)是完全一致的,說明我們的編碼是沒有問題的。

歡迎關(guān)注:

總結(jié)

以上是生活随笔為你收集整理的信息摘要算法之三:SHA256算法分析与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。