【问题标题】:Hashing message gives the same hash for different values散列消息为不同的值提供相同的散列
【发布时间】:2016-10-22 19:50:16
【问题描述】:

我正在尝试编写一个代码,该代码将从 3 个随机生成的数字 (x1,x2,x3) 中计算 1000 个 SHA256 哈希 理想情况下,它应该在从 1 到 1000 的循环中,我需要的只是将值存储在列表或数组中的某个位置,然后再分析它们。 当我运行下面的代码时,即使随机数每次都在变化, print(digest.finalize()) 总是返回相同的哈希

import random
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
while i<1000:
        digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
        x1=random.randrange(2,256)
        x2=random.randrange(2,256)
        x3=random.randrange(2,256)
        print("x1,x2,x3 are ",x1,x2,x3)
        digest.update(b'x1')
        digest.update(b'x2')
        digest.update(b'x3')
        print(digest.finalize())
        del digest
        #print(digest.finalize())

        i=i+1

【问题讨论】:

  • 您正在散列 x1、x2 和 x3 的值,而不是散列字节对象 b'x1x2x3'。
  • 不确定我是否理解。我必须改变什么才能让它工作?谢谢
  • 通过学习python的基础知识。在哪种编程语言中,变量x 可以通过字符串"x" 访问? :-)
  • 通过学习python基础???请@sascha 为其他地方留下居高临下的语气。如果您想教育某人,请从您自己开始。您可能会发现此链接很有用cryptography.io/en/latest/hazmat/primitives/…

标签: python-3.x hash cryptography


【解决方案1】:

考虑digest.update(x1) 和digest.update(b'x1') 之间的区别。后者只是将字符 b'x' 和 b'1' 提供给更新方法,与变量 x1 完全无关。

对变量x1中的值进行散列

import random
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
x1=random.randrange(2,256)

你需要类似的东西

digest.update(x1)

然而,这仍然是不正确的,因为update() 需要一个字节对象作为其参数,而不是整数。因此正确的调用类似于

digest.update(x1.to_bytes(1, 'big')) 

请仔细阅读int的to_bytes方法的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2015-06-25
    • 2020-03-12
    • 2018-07-27
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多