ruby - 如何解密 ruby 中的 MD5 摘要 5 位 PIN?

ruby - How to decrypt MD5 digested 5 digit PIN in ruby?

假设我有一个五位数 PIN 码的 md5 散列。它以字符串形式给出。

唯一的办法就是破解它,意思是尝试每一种组合,对其进行哈希处理,然后与你想要破解的哈希值进行比较。我正在尝试 return 将破解的 PIN 码作为字符串。给定初始哈希输入是 PIN 的 md5 摘要(在字符串中)。这是我的代码:

require 'digest' 
def crack_PIN(hash)
  md5 = Digest::MD5.new
  permutations = [0,1,2,3,4,5,6,7,8,9].permutation(5).to_a
  perm_digest = permutations.map{|element| md5.hexdigest(element.map{|num| "#{num}"}.join)}
  x = perm_digest.index(hash)
  permutations[x].map{|num| "#{num}"}.join
end

此代码的问题在于它只使用每个数字一次(它不能根据需要重复每个数字多次)。我想弄清楚我能做些什么来改变这个代码,让它适用于每个数字的任意数量的重复。谢谢:-)

最小变化:

permutations = '00000'..'99999'

这将为您提供范围内所有字符串的完整列表。然后,您可以对它们中的每一个尝试 运行ning md5.hexdigest

另请注意:您的方法将在每次 运行 时执行 完全相同的 系列计算!!您可以通过以某种方式 缓存 计算结果来提高性能(即生成 PIN 的查找 table --> md5 总和)并仅在您的代码中引用它。

将 Tom 和 Cary 的建议合并为一个简化版本,该版本比您的示例需要更少的内存,因为它不会将所有哈希值存储在内存中。此外,它 returns 一旦找到 PIN,它不会预先生成所有哈希值。

require 'digest' 

def crack_PIN(hash)
  md5 = Digest::MD5.new

  ('00000'..'99999').find { |pin| md5.hexdigest(pin) == hash }
end

crack_PIN("c4ded2b85cc5be82fa1d2464eba9a7d3")
#=> "45678"