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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

sha256 加密算法

發布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sha256 加密算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

sha256 加密算法

go 調用 sha256 加密

字符串哈希值

package mainimport("fmt""crypto/sha256""io""log""os" )func main() {// 第一種調用方法sum := sha256.Sum256([]byte("hello world\n"))fmt.Printf("%x\n", sum)// 第二種調用方法h := sha256.New()h.Write([]byte("hello world\n"))fmt.Printf("%x\n", h.Sum(nil)) }

文件哈希值

// 對文件加密f, err := os.Open("test.txt")if err != nil {log.Fatal(err)}defer f.Close()h = sha256.New()if _, err := io.Copy(h, f); err != nil {log.Fatal(err)}fmt.Printf("%x\n", h.Sum(nil))

源碼下載:https://github.com/didianV5/blockchain/tree/master/encryption/sha256

sha256 實現原理

SHA-256 算法輸入報文的最大長度不超過2^64 bit,輸入按512-bit 分組進行處理,產生的輸出是一個256-bit 的報文摘要。

  • 附加填充比特:對報文進行填充使報文長度與448 模512 同余(長度=448 mod 512),填充的比特數范圍是1 到512,填充比特串的最高位為1,其余位為0。就是先在報文后面加一個 1,再加很多個0,直到長度 滿足 mod 512=448.為什么是448,因為448+64=512. 第二步會加上一個 64bit的 原始報文的 長度信息。

  • 附加長度值 將用64-bit 表示的初始報文(填充前)的位長度附加在步驟1 的結果后(低位字節優先)。

  • 初始化緩存:使用一個256-bit 的緩存來存放該散列函數的中間及最終結果。 該緩存表示為

    const (init0 = 0x6A09E667init1 = 0xBB67AE85init2 = 0x3C6EF372init3 = 0xA54FF53Ainit4 = 0x510E527Finit5 = 0x9B05688Cinit6 = 0x1F83D9ABinit7 = 0x5BE0CD19 )
  • 處理512-bit(16 個字)報文分組序列:該算法使用了六種基本邏輯函數,由64步迭代運算組成。每步都以256-bit 緩存值ABCDEFGH 為輸入,然后更新緩存內容。 每步使用一個32-bit 常數值Kt 和一個32-bit Wt。

    • 常數K為
    var _K = []uint32{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, }
    • Wt 是 分組之后的報文
    for i := 0; i < 16; i++ {j := i * 4w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])}for i := 16; i < 64; i++ {v1 := w[i-2]t1 := (v1>>17 | v1<<(32-17)) ^ (v1>>19 | v1<<(32-19)) ^ (v1 >> 10)v2 := w[i-15]t2 := (v2>>7 | v2<<(32-7)) ^ (v2>>18 | v2<<(32-18)) ^ (v2 >> 3)w[i] = t1 + w[i-7] + t2 + w[i-16]}
    • 64步迭代運算
    for i := 0; i < 64; i++ {t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c))h = gg = ff = ee = d + t1d = cc = bb = aa = t1 + t2}h0 += ah1 += bh2 += ch3 += dh4 += eh5 += fh6 += gh7 += h
  • 生成256-bit的報文摘要 所有的512-bit分組處理完畢后,對于SHA-256算法最后一個分組產生的輸出便是256-bit的報文摘要。

    dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h0, h1, h2, h3, h4, h5, h6, h7

源碼下載

源碼地址: https://github.com/didianV5/blockchain/tree/master/encryption/sha256/source

總結

以上是生活随笔為你收集整理的sha256 加密算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。