可视化运行哈希SHA 256

查看 36|回复 2
作者:Gaobosky30   
在线可视化运行SHA256:https://sha256algorithm.com/哈希函数三大特性给定一个安全的哈希函数 H(x),存在3个困难问题:
  • 找原象:给定H(x),找到一些 x^{'},存在 H(x^{'})=H(x),困难。(单向性)
  • 找第二原象:给定任意 x_1,找到x_2,存在 H(x_1)=H(x_2)并且 x_1 \neq x_2,困难。
  • 找碰撞:找到任意 x_1,x_2,(x_1 \neq x_2),存在 H(x_1)=H(x_2),困难。
    很显然,Q3比Q2简单,同时Q2比Q1简单,更容易实现。如果一个安全的哈希函数 H(x)产生 N 比特输出,一个攻击者对任意输入尝试 2^{N/2} 次哈希操作,这里 N 足够大,有多大的概率能找到碰撞呢?参考《introduction to Blockchain》给出的计算过程,这个概率约等于63.21%
    但是,如果输出是256比特,攻击者需要进行 2^{128} 次哈希操作,每次哈希操作设为1 ms,那么这个破解过程需要至少 10^{40} 年。SHA 2 函数族SHA256是SHA-2之下细分出来的一种算法,SHA-2下又可以再分为六个不同的算法标准。其中包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。
    SHA 256sha256采用的是Merkle-Damgard结构。
    整个流程如下:补位补位:假设消息 M 的二进制编码长度为 l 位,首先在消息末尾补上一位"1", 然后再补上 k 个"0", 其中 k 为下列方程的最小非负整数:
    $$
    l+1+k≡448 \ mod \ 512
    $$然后,再在上述字符串后面补上 l 的二进制表示形式。示例:输入消息“abc”则,消息的二进制编码表示为:
    $$
    01100001\ 01100010\ 01100011
    $$第一次补位,在消息末尾补上一位“1”,结果为:
    $$
    01100001\ 01100010\ 01100011\ 1
    $$第二次补位,因为消息二进制长度为 l=24 ,可以得到 k=423,在后面补上423位“0”,结果为:
    $$
    01100001\ 01100010\ 01100011\ 1 \underbrace {00 \dots 0}_{423}
    $$第三次补位,这里补的是原消息"abc"的二进制长度 l=24  的二进制表示形式(64位):00...011000, 补完以后的结果如下:
    $$
    01100001\ 01100010\ 01100011\ 1 \underbrace {00 \dots 0}_{423}\underbrace {00 \dots 011000}_{64}
    $$最终补完以后,消息二进制位数长度是512的倍数。可视化结果:图片初始化哈希值 H创建8个哈希值。这些是硬编码的常数,代表前8个素数的平方根的小数部分的前32位:2、3、5、7、11、13、17、19。举个例子,\sqrt{2} 的小数部分约为0.414213562373095048, 而其中
    $$
    0.414213562373095048 \approx 6 *16^{-1}+a*16^{-2}+\dots
    $$
    于是, 质数2的平方根的小数部分取前32位就对应 0x6a09e667 。如此类推,初始哈希值 H^{(0)} 由以下8个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 \\
    $$
    初始化常数 K用到64个常量,这些常量是对自然数中前64个质数的立方根的小数部分取前32比特而来。这64个常量如下:
    $$
    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
    $$
    消息分块将补码处理后的消息以512位为单位分块为: M^{(1)},M^{(2)},\dots,M^{(N)}。其中第 i 个消息块的前32位表示为: M^{(i)}_0, 第二个32位为: M^{(i)}_1, 以此类推, 最后一组32位的消息块可表示为: M^{(i)}_{15}。建立邮件时间表 w
  • 建立一个新数组,每32位一个条目,共64个条目,得到 w[0\dots 63]。
  • 将补位后的数值填充到前16个条目,结果如下:
    图片
  • 使用公式将数组剩余部分填充完成。

    $$
    s0(x) = S^7(x) \oplus S^{18}(x) \oplus  R^3(x)\\s1(x) = S^{17}(x) \oplus S^{19}(x) \oplus R^{10}(x)\\R^n:右移n位 \ S^n:循环右移n位\\+:相加以后对2^{32}求余\\w = w[i-16] + s0(w[i-15]) + w[i-7] + s1(w[i- 2])
    $$
    压缩
  • 初始化变量 a,b,c,d,e,f,g,h ,并将它们分别设置为等于当前的哈希值。当 i=1 时,用 H^{0} 赋值这些变量:

    $$
    a\gets H^{(0)}_0 \\b\gets H^{(0)}_1 \\c\gets H^{(0)}_2 \\d\gets H^{(0)}_3 \\e\gets H^{(0)}_4 \\f\gets H^{(0)}_5 \\g\gets H^{(0)}_6 \\h\gets H^{(0)}_7
    $$
  • 循环开始,使用公式更新参数

    $$
    S1(x) = S^6(x) \oplus S^{11}(x) \oplus S^{25}(x)\\ch = (e \wedge  f) \oplus (\neg e \wedge  g)\\temp1 = h + S1(e) + ch + k + w\\S0(x) = S^2(x) \oplus S^{13}(x) \oplus S^{22}(x)\\maj = (a \wedge  b) \oplus (a \wedge  c) \oplus (b \wedge  c)\\temp2 := S0(a) + maj\\h = g\\g = f\\e = d + temp1\\d = c\\c = b\\b = a\\a = temp1 + temp2
    $$
    循环最终值将哈希值添加到变量中来修改哈希值,公式如下:
    $$
    h0 = h0 + a = 10111001010011010010011110111001\\h1 = h1 + b = 10010011010011010011111000001000\\h2 = h2 + c = 10100101001011100101001011010111\\h3 = h3 + d = 11011010011111011010101111111010\\h4 = h4 + e = 11000100100001001110111111100011\\h5 = h5 + f = 01111010010100111000000011101110\\h6 = h6 + g = 10010000100010001111011110101100\\h7 = h7 + h = 11100010111011111100110111101001\\
    $$
    计算哈希值串接 h0 \ h1 \dots h7 ,等到最终的哈希结果:
    参考资料《应用密码学 | SHA-256哈希算法原理详解》https://zhuanlan.zhihu.com/p/431372152《哈希函数(Hash Functions - 散列函数)的基本介绍》https://blog.csdn.net/Rong_Toa/article/details/109016948《详细解释sha256算法》https://www.51credit.com/wenda/880488.html《introduction to Blockchain》运行示例来自:https://sha256algorithm.com/

    消息, 函数

  • Gaobosky30
    OP
      
    $$ 公式打不出来,在线可视化运行SHA256:https://sha256algorithm.com/
    是否还能放弃   
    哈哈看不懂
    您需要登录后才可以回帖 登录 | 立即注册