Python SHA256哈希计算

时间:2019-04-25 19:56:50

标签: python python-3.x hash sha256 sha

我正在用Python编写SHA256实现,填充,解析和消息调度似乎工作正常,我的问题在于哈希计算。目前,我只是想计算工作变量“ a”。 这是我得到的值(十六进制)

  

5d6aebe0

根据this的预期输出:

  

5D6AEBCD

这是我的代码:

将工作变量设置为FIPS-180

中指定的常量
"null"

设置取决于值t的两个重要变量:

a = int('6a09e667', 16)
b = int('bb67ae85', 16)
c = int('3c6ef372', 16)
d = int('a54ff53a', 16)
e = int('510e527f', 16)
f = int('9b05688c', 16)
g = int('1f83d9ab', 16)
h = int('5be0cd19', 16)

根据wikipedia上的伪代码:

W = int('61626380', 16)
K = int('428a2f98', 16)

ROTR功能:

S1 = hash.ROTR(e, 6) ^ hash.ROTR(e, 11) ^ hash.ROTR(e, 25)
ch = (e & f) ^ ((~e) & g)#((e1) & g)
temp1 = (h + S1 + ch + K + W) % math.pow(2, 32)
S0 = hash.ROTR(a, 2) ^ hash.ROTR(a, 13) ^ hash.ROTR(a, 22)
maj = (a & b) ^ (a & c) ^ (b & c)
temp2 = (S0 + maj) % math.pow(2, 32)
a = int((temp1 + temp2) % math.pow(2, 32))

或者,分成多个功能,如FIPS-180中指定的(产生相同的输出)

@staticmethod
def ROTR(x, n, w=32):
    return (x >> n) | (x << w - n)

哈希类:

T1 = int((h + hash.SIGMA1(e) + hash.Ch(e, f, g) + hash.K[t] + W) % math.pow(2, 32))
T2 = int((hash.SIGMA0(a) + hash.Maj(a, b, c)) % math.pow(2, 32))
a = int((T1 + T2) % math.pow(2, 32))

我正在使用Python 3 btw。预先感谢。

1 个答案:

答案 0 :(得分:3)

您需要在此处添加更多屏蔽以减少溢出位。例如,您的ROTR

def ROTR(x, n, w=32):
    return (x >> n) | (x << w - n)

x边界上方完整的w的所有高位保留;您想从w构建一个掩码,并屏蔽掉高位,例如:

def ROTR(x, n, w=32):
    return ((x >> n) | (x << w - n)) & ((1 << w) - 1)

只要您可能超出假定的“寄存器宽度”,就需要使用类似的掩码。他们还可以替换您对% math.pow(2, 32)容易出错的用法,进行更改:

int((temp1 + temp2) % math.pow(2, 32))

收件人:

(temp1 + temp2) & ((1 << 32) - 1)

或等效地:

(temp1 + temp2) % 2 ** 32

在溢出不太明显的按位求反时,也需要发生这种情况:Python的int是无限精度的,而非负值的按位求反则为负数,有效地添加了无限{左侧的1}}位(在语言指定的伪二进制补码行为中)。因此,1必须变为~x之类,才能将其强制返回仅包含低32位的正值。

这必须在全局范围内完成(因此,~x & ((1 << 32) - 1)temp1实际上是temp2,而不是int的值)。通常,float完全没有用;您要么要使用math.pow运算符(不会强制转换为**并更有效地执行),要么要使用内置的float函数(仅对于其三个参数使用进行有效的模幂运算。