SHA256的要点总结

SHA256在线验证链接SHA256 online hash function 

My Golang github源码 :https://github.com/kumataahh/Golang-toolbox/blob/master/sha256/sha256_source.go

 SHA256的加密过程归为三个点

  • 常量的初始化
  • 信息预处理
  • 使用到的逻辑运算
  • 计算信息摘要

初始化常量

用作后面对需要加密的信息的处理。

8个哈希初值:自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来

64个哈希常量:对自然数中前64个质数(2,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来。

// golang 
// 8个哈希初值和64个哈希常量

const (
    chunk     = 64
    init0     = 0x6A09E667
    init1     = 0xBB67AE85
    init2     = 0x3C6EF372
    init3     = 0xA54FF53A
    init4     = 0x510E527F
    init5     = 0x9B05688C
    init6     = 0x1F83D9AB
    init7     = 0x5BE0CD19 
)

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,}

信息预处理

在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。

两个步骤:附加填充比特附加长度

// step 1 附加填充bit
// simple need hash data  : "abc"
// a,b,c对应的ASCII码分别是97,98,99
// ascii code :01100001 01100010 01100011
//  一串补位操作后,数据为(hex)长度为448
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000

// step 2 附加长度值,用一个64bit数据表示消息长度
// 补长后
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018

逻辑运算

SHA256散列函数中涉及的操作全部是逻辑的位运算,一系列位运算,包含如下函数

分享图片

 

分享图片

计算信息摘要

step1:消息分解成512-bit大小的块

分享图片

能分n快就完成n次迭代,n次迭代的结果就是最终的哈希值,即256bit的数字摘要

step2:8个哈希初值的迭代运算

分享图片

step3:构造64个字(word)

对于每一块,将块分解为16个32-bit的big-endian的字,记为w[0],…,w[15]

前16个字直接由消息的第i个块分解得到

其余的字由如下迭代公式得到:

分享图片

step4:64次加密循环

分享图片

ABCDEFGH这8个字(word)在按照一定的规则进行更新

  • 深蓝色方块是事先定义好的非线性逻辑函数
  • 红色田字方块代表 mod $ 2^{32} $ addition,即将两个数字加在一起,如果结果大于$ 2^{32} ,你必须除以 ,你必须除以,你必须除以 2^{32} $并找到余数。
  • ABCDEFGH一开始的初始值分别为$ H_{i-1}(0),H_{i-1}(1),H_{i-1}(7) $
  • Kt是第t个密钥,对应我们上文提到的64个常量
  • Wt是本区块产生第t个word。原消息被切成固定长度512-bit的区块,对每一个区块,产生64个word,通过重复运行循环n次对ABCDEFGH这八个字循环加密。
  • 最后一次循环所产生的八个字合起来即是第i个块对应到的散列字符串$ H_{i} $

 

 

笔记参考:SHA256算法原理详解

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1 Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...