step1 常量初始化
1 | h0 := 0x6a09e667 |
这八个初始向量怎么来的?
答曰: 前八个质数取根号后的值 取小数部分, 然后乘以2的32次方, 对结果取整 就是初始向量.
1 | import math |
step2 常量64位 K表
如果生成的?
答曰: 前64个质数,取立方根, 跟8位常量的生成算法一样, 只是取的是立方根, 下面给出代码
1 | import math |
综上,这些常量也只是根据质数生成的, 换一批质数, 获取随机常量就可以达到魔改的目的
step 3 填充
假设有数据 ‘abc’, 用16进制表示 是
1 | 61626300 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
0x61 是 ‘a’的 ascii 码
0x62 是 ‘b’的 ascii 码
0x63 是 ‘c’的 ascii 码
将数据尾部添加一个 bit’1’, 然后再添加若干个 bit’0’, 凑够 448 位
448 + 64 = 512, 为什么要凑 448 因为还有 64位置是用来记录数据的长度的。 448位记录是的数据 64位记录的是长度
这样数据在内存中就变成了如下分布
1 | 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
0x80 是 10000000的hex表示.
0x18 对应十进制是 24, 正好就是 abc 所占的bit
计算, 生成 w0-w63
w0-w15 就是原来的数据.
w16-w63 根据如下算法生成
1 | def _sigma0(num: int): |
接下给出sha256 完整代码
1 | """This Python module is an implementation of the SHA-256 algorithm. |