• SHA256的总结与Go实现


    SHA256在线验证链接:SHA256 online hash function 

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

     SHA256的加密过程归为四个点

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

    初始化常量

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

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

    64个哈希常量:对自然数中前64个质数(2,3,5,7,11,13,17,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算法原理详解

  • 相关阅读:
    使用模拟器混淆前端代码
    中间人攻击 -- Cookie 喷发
    【探索】机器指令翻译成 JavaScript
    复杂的 Hash 函数组合有意义吗?
    【探索】利用 canvas 实现数据压缩
    【趣事】用 JavaScript 对抗 DDOS 攻击 (下)
    【趣事】用 JavaScript 对抗 DDOS 攻击
    【探索】在 JavaScript 中使用 C 程序
    【探索】无形验证码 —— PoW 算力验证
    对抗明文口令泄露 —— Web 前端慢 Hash
  • 原文地址:https://www.cnblogs.com/kumata/p/10408646.html
Copyright © 2020-2023  润新知