0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Hash算法簡(jiǎn)介

lviY_AI_shequ ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-06-08 14:01 ? 次閱讀

一、Hash算法的身影

可以看到,在生成比特幣地址(《精通比特幣》第4章提到),以及生成區(qū)塊唯一標(biāo)識(shí)(《精通比特幣》第7章提到):區(qū)塊Hash值時(shí)(即挖礦的過(guò)程),都使用了Hash算法,特別是SHA256算法。比特幣系統(tǒng)本身也就是加密算法的衍生物。

二、SHA256算法過(guò)程

本文主要簡(jiǎn)述一下SHA256算法的過(guò)程,下一篇會(huì)大概說(shuō)一下它的理論基礎(chǔ)。

1. 輸入信息x

SHA256要求報(bào)文長(zhǎng)度不超過(guò)2^64bit。

2. 補(bǔ)位

因?yàn)椴捎玫氖欠纸M加密的方法,每組長(zhǎng)度是512bit,而原始的信息x,不一定是512的倍數(shù),也就是說(shuō)不一定能剛好分成每組都是512bit的情況。這時(shí)候需要補(bǔ)位。

在x后面先補(bǔ)一個(gè)1,然后再補(bǔ)多個(gè)0,一直到總長(zhǎng)度(x以及補(bǔ)的位數(shù))模512是448

3. 補(bǔ)長(zhǎng)度

為什么第二步不直接把總長(zhǎng)度補(bǔ)到512的倍數(shù)呢,因?yàn)楹竺孢€要補(bǔ)64位,記錄原始信息x的位數(shù)。(64 + 448) % 512 = 0。可以看到,只有64位表示原始信息x的位數(shù),所以x的最大長(zhǎng)度是2^64。

4. 計(jì)算Hash值

前面已經(jīng)將消息補(bǔ)成了512的倍數(shù),總長(zhǎng)度變?yōu)?12 * N。計(jì)算hash值的基本思想是:先將處理完的消息分成N個(gè)512bit的數(shù)據(jù)塊:M[1],M[2],……,M[N],然后一塊一塊的處理:哈希初值H[0]經(jīng)過(guò)第一個(gè)數(shù)據(jù)塊M[1]得到H[1],H[1]經(jīng)過(guò)第二個(gè)數(shù)據(jù)塊M[2]得到H[2],……,依次處理,最后得到H[N]。每個(gè)哈希值,比如H[0],由8個(gè)32bit組成,32bit又稱為字,也就是說(shuō)每個(gè)hash值都由8個(gè)字組成。最后將H[N]的8個(gè)字連接成256bit(8 * 32 bit)的最終值。至于為什么可以這么做,我們下一篇再介紹,先看流程。

1) 哈希初值H[0]

SHA256算法中用到的哈希初值H[0](共有8個(gè)32bit)為:

H[0][0] = 0x6A09E667

H[0][1] = 0xBB67AE85

H[0][2] = 0x3C6EF372

H[0][3] = 0xA54FF53A

H[0][4] = 0x510E527F

H[0][5] = 0x9B05688C

H[0][6] = 0x1F83D9AB

H[0][7] = 0x5BE0CD19

0x表示的是十六進(jìn)制,十六進(jìn)制中一位表示4bit。

注:這些初值是對(duì)自然數(shù)中前8個(gè)質(zhì)數(shù)2、3、5、7、11等的平方根的小數(shù)部分取前32bit而來(lái)。

2) 循環(huán)計(jì)算

# M的下標(biāo)從1開始,M即為M[1], ..., M[N]

for i in range(1, N + 1):

# 第一步,先根據(jù)16個(gè)32bit的原始消息,生成64個(gè)32bit

W = [0] * 64

for t in range(0, 64):

if t < 16:

W[t] = M[i][t]

else:

W[t] = SSIG1(W[t - 2]) + W[t-7] + SSIG0(W[t-15]) + W[t-16]

# 第二步,將上次的hash值,也就是8個(gè)32bit,賦值到8個(gè)臨時(shí)變量,用這8個(gè)臨時(shí)變量計(jì)算

# 原本的hash值在本輪結(jié)束的時(shí)候仍然需要使用

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]

# 第三步,執(zhí)行散列計(jì)算,內(nèi)循環(huán)是64輪,使用了上面的64個(gè)W,以及提前定義好的64個(gè)K

for t in range(0, 64):

t1 = h + BSIG1(e) + CH(e, f, g) + K[t] + W[t]

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

# 第四步,將本輪經(jīng)過(guò)64個(gè)內(nèi)循環(huán)新計(jì)算的臨時(shí)值和上次的hash值求和,作為本輪最終的hash值

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]

# 最終H[N]的8個(gè)32bit返回,即為該消息的SHA256結(jié)果

3) 函數(shù)和常量說(shuō)明

(1) 64個(gè)常量K為:

K = [

0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,

0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,

0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,

0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,

0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,

0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,

0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,

0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]

注:這些常數(shù)的取值是從自然數(shù)中前64個(gè)質(zhì)數(shù)的立方根的小數(shù)部分取前32bit而來(lái)的。

(2) 利用到的函數(shù)為:

# 本段代碼沒有使用python語(yǔ)法

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) XOR ROTR^13(x) XOR ROTR^22(x)

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

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

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

其中,除了與或非外,XOR是異或, ROTR^n是循環(huán)右移n位,SHR^n是右移n位。

三、總結(jié)

上面就是SHA256的計(jì)算過(guò)程。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Hash算法
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    7379
  • 比特幣
    +關(guān)注

    關(guān)注

    57

    文章

    7002

    瀏覽量

    140127

原文標(biāo)題:區(qū)塊鏈系列--比特幣 (3):區(qū)塊鏈中的Hash算法

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Rust語(yǔ)言Hash特征的基礎(chǔ)用法和進(jìn)階用法

    是一種通用的哈希算法,用于將任意類型的數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的哈希值。下面是一個(gè)簡(jiǎn)單的示例,演示如何使用Hash trait計(jì)
    的頭像 發(fā)表于 09-19 16:02 ?1350次閱讀

    1HASH函數(shù)在軟件自保護(hù)中的應(yīng)用

    本文介紹了HASH 函數(shù)的原理,并重點(diǎn)討論了其中的SHA-1 算法及其在軟件自保護(hù)中的應(yīng)用和實(shí)現(xiàn)技術(shù)。關(guān)鍵詞:HASH 函數(shù)軟件保護(hù) 信息安全Abstract: This paper introduces the basic t
    發(fā)表于 08-07 09:28 ?17次下載

    基于Hash和二叉樹的路由表查找算法

    基于Hash和二叉樹的路由表查找算法 :提出了一種基于Hash和二又樹的路由表查找算法,這一算法可以滿足()C-768的轉(zhuǎn)發(fā)要求,支持超過(guò)
    發(fā)表于 02-22 17:06 ?35次下載

    Hash校驗(yàn)工具

    hash
    發(fā)表于 03-22 17:14 ?1次下載

    常見的hash算法有哪些及其原理是什么

    Hash,一般翻譯做“散列”,也有直接音譯為“哈?!钡模褪前讶我忾L(zhǎng)度的輸入(又叫做預(yù)映射, pre-image),通過(guò)散列算法,變換成固定長(zhǎng)度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間
    發(fā)表于 12-09 10:25 ?2.6w次閱讀
    常見的<b class='flag-5'>hash</b><b class='flag-5'>算法</b>有哪些及其原理是什么

    基于跳躍hash的對(duì)象分布算法

    算法簡(jiǎn)潔、高效,支持權(quán)值和數(shù)據(jù)冗余機(jī)制.該算法創(chuàng)造性地將節(jié)點(diǎn)映射到二維矩陣,對(duì)象的分布、定位只需從矩陣的行內(nèi)、行間計(jì)算目標(biāo)節(jié)點(diǎn)的行號(hào)和列號(hào)即可.理論研究表明,該算法滿足公平性、自適應(yīng)性、緊湊性、節(jié)點(diǎn)變化對(duì)象遷移量較小的特點(diǎn).實(shí)驗(yàn)
    發(fā)表于 12-26 10:43 ?0次下載

    什么是hash值與比特幣之間又有什么關(guān)系

    hash是什么,有點(diǎn)類似「洗牌」把牌洗亂的概念,只是洗的不是牌,而是一筆數(shù)據(jù),這個(gè)「洗」的過(guò)程是經(jīng)過(guò)嚴(yán)謹(jǐn)定義的,且產(chǎn)生的結(jié)果會(huì)是固定長(zhǎng)度的。常見的hash算法有MD5、RIPEMD-160、SHA1
    發(fā)表于 01-03 14:15 ?1.2w次閱讀

    基于區(qū)塊鏈中的HASH算法解析

    hash算法之前先明確一個(gè)基礎(chǔ)的計(jì)算機(jī)知識(shí),計(jì)算機(jī)在底層機(jī)器碼是采用二進(jìn)制的模式,所謂二進(jìn)制簡(jiǎn)單來(lái)說(shuō)就是底層以0/1來(lái)標(biāo)識(shí),所有數(shù)據(jù)傳輸記錄都以010101的模式來(lái)存儲(chǔ)記錄,兩種狀態(tài)也可認(rèn)為就是一
    發(fā)表于 06-13 11:42 ?1236次閱讀
    基于區(qū)塊鏈中的<b class='flag-5'>HASH</b><b class='flag-5'>算法</b>解析

    hash算法的原理和實(shí)際應(yīng)用等幾個(gè)角度,對(duì)hash算法進(jìn)行一個(gè)講解

    由于hash的原理是將輸入空間的值映射成hash空間內(nèi),而hash值的空間遠(yuǎn)小于輸入的空間。根據(jù)抽屜原理,一定會(huì)存在不同的輸入被映射成相同輸出的情況。那么作為一個(gè)好的hash
    的頭像 發(fā)表于 06-03 17:34 ?3221次閱讀
    從<b class='flag-5'>hash</b><b class='flag-5'>算法</b>的原理和實(shí)際應(yīng)用等幾個(gè)角度,對(duì)<b class='flag-5'>hash</b><b class='flag-5'>算法</b>進(jìn)行一個(gè)講解

    Hash哈希競(jìng)猜游戲開發(fā)方案(技術(shù)詳情)簡(jiǎn)介

    Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,哈l8l希2809系2756統(tǒng)競(jìng)猜模式就是把任意長(zhǎng)度的輸入(又叫做預(yù)映射, pre-image),通過(guò)散列算法
    發(fā)表于 06-24 10:08 ?495次閱讀

    關(guān)于比特幣WK與HASH

    WK實(shí)際上就是通過(guò)一系列算法,計(jì)算出符合要求的哈希值(HASH),從而爭(zhēng)取到記賬權(quán)。這個(gè)過(guò)程實(shí)際上就是試錯(cuò)的過(guò)程,一臺(tái)計(jì)算機(jī)每秒產(chǎn)生的隨機(jī)HASH碰撞次數(shù)越多,先計(jì)算出正確HASH的概
    的頭像 發(fā)表于 06-29 09:33 ?1887次閱讀

    hash算法在FPGA中的實(shí)現(xiàn)(1)

    在FPGA的設(shè)計(jì)中,尤其是在通信領(lǐng)域,經(jīng)常會(huì)遇到hash算法的實(shí)現(xiàn)。hash算法在FPGA的設(shè)計(jì)中,它主要包括2個(gè)部分,第一個(gè)就是如何選擇一個(gè)好的h
    的頭像 發(fā)表于 09-07 17:01 ?1142次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的實(shí)現(xiàn)(1)

    hash算法在FPGA中的實(shí)現(xiàn)(2)

    在前面的文章中:hash算法在FPGA中的實(shí)現(xiàn)(一)——hash表的組建,記錄了關(guān)于hash表的構(gòu)建,這里記錄另外一個(gè)話題,就是hash鏈表
    的頭像 發(fā)表于 09-07 17:02 ?733次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的實(shí)現(xiàn)(2)

    hash算法在FPGA中的實(shí)現(xiàn)(3)

    在前面的文章中主要介紹了hash表及其鏈表的結(jié)構(gòu),同時(shí)說(shuō)明了如何讀取表項(xiàng)。那表項(xiàng)是如何寫入的了?前期的文章中有少量的提及,這里單獨(dú)寫一篇,介紹兩種常見的方案。
    的頭像 發(fā)表于 09-07 17:02 ?701次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的實(shí)現(xiàn)(3)

    HASH算法加密芯片的工作原理及其在STM32 MCU上的應(yīng)用

    本文主要研究了HASH算法加密芯片的工作原理及其在STM32 MCU上的應(yīng)用,實(shí)現(xiàn)了外部加密芯片對(duì)STM32 MCU的程序保護(hù),目前的技術(shù)手段無(wú)法對(duì)其進(jìn)行破解,其安全性優(yōu)于其它加密方式。
    的頭像 發(fā)表于 10-24 15:01 ?3511次閱讀
    <b class='flag-5'>HASH</b><b class='flag-5'>算法</b>加密芯片的工作原理及其在STM32 MCU上的應(yīng)用