Python SHA256哈希计算

问题描述 投票:1回答:1

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

5d6aebe0

根据this的预期产出:

点击这里

这是我的代码:

将工作变量设置为FIPS-180中指定的常量

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)

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

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

wikipedia上的伪代码:

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))

ROTR功能:

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

或者,分成函数,如FIPS-180中指定的(产生相同的输出)

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))

哈希类:

@staticmethod
def ROTR(x, n, w=32):
    return (x >> n) | (x << w - n)
def SIGMA0(x):
    return hash.ROTR(x, 2) ^ hash.ROTR(x, 13) ^ hash.ROTR(x, 22)
def SIGMA1(x):
    return hash.ROTR(x, 6) ^ hash.ROTR(x, 11) ^ hash.ROTR(x, 25)
def Ch(x, y, z):
    return (x & y) ^ (~x & z)
def Maj(x, y, z):
    return (x & y) ^ (x & z) ^ (y & z)

我正在使用Python 3顺便说一句。提前致谢。

python python-3.x hash sha256 sha
1个回答
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的ints是无限精度,而非负值的按位否定产生负值,有效地在左边添加无限的1位(在伪 - 语言指定的两个补码行为)。因此,~x必须成为~x & ((1 << 32) - 1)之类,以强制它回到仅包含低32位的正值。

这必须在全球范围内完成(所以当你用它们计算时,temp1temp2实际上是int,而不是float值)。一般来说,math.pow完全没用;你要么想使用**算子(不强制float并且执行效率更高),要么使用内置的pow函数(只需要三个参数来进行有效的模幂运算)。

© www.soinside.com 2019 - 2024. All rights reserved.