【问题标题】:How do I enter md5 block bytes in Ruby?如何在 Ruby 中输入 md5 块字节?
【发布时间】:2014-10-15 21:26:00
【问题描述】:

我正在尝试复制以下 python 代码来验证“What's the shortest pair of strings that causes an MD5 collision?”的答案中给出的 md5 冲突。

>>> from array import array
>>> from hashlib import md5
>>> input1 = array('I',  [0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,0x6503cf04,
    0x854f709e,0xfb0fc034,0x874c9c65,0x2f94cc40,0x15a12deb,0x5c15f4a3,0x490786bb,
    0x6d658673,0xa4341f7d,0x8fd75920,0xefd18d5a])
>>> input2 = array('I', [x^y for x,y in zip(input1,
    [0, 0, 0, 0, 0, 1<<10, 0, 0, 0, 0, 1<<31, 0, 0, 0, 0, 0])])
>>> input1 == input2
False
>>> md5(input1).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
>>> md5(input2).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'

如何在 Ruby 中处理 input1input2Digest::Md5 似乎不接受数组。

【问题讨论】:

  • “过程”是什么意思?你的原始数据是什么格式的? String#unpack 函数可能是一个不错的起点。
  • 我的意思是像python代码md5(input1)那样做。它不适用于Digest::MD5它只接受字符串。
  • 然后从您的输入中创建一个字符串。您可以使用Array#pack 来构建它们。

标签: ruby md5


【解决方案1】:

如前所述,使用Array#pack 构建二进制字符串,然后传递给哈希函数。工作代码:

require 'digest/md5'

input1= [
  0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,0x6503cf04,0x854f709e,
  0xfb0fc034,0x874c9c65,0x2f94cc40,0x15a12deb,0x5c15f4a3,0x490786bb,
  0x6d658673,0xa4341f7d,0x8fd75920,0xefd18d5a].pack('I*')
p Digest::MD5.hexdigest input1
# "cee9a457e790cf20d4bdaa6d69f01e41"

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2020-10-13
    • 2021-06-06
    相关资源
    最近更新 更多