Ruby中的SHA2和字节管理

时间:2013-10-18 16:59:33

标签: ruby cryptography sha sha256 digest

作为密码学课程中的编程作业,我遇到以下问题:

读取一个视频文件,将其分成1KB块,抓住最后一个块,得到它的SHA256总和,将该和加到倒数第二个块,得到生成块的SHA256和,依此类推。 ..问题的答案是你从这个链中得到的最后一笔SHA256。该算法应用于某个视频的答案是SHA256总和:'5b96aece304a1422224f9a41b228416028f9ba26b0d1058f400200f06a589949'。

我理解这个问题,但我无法用Ruby解决它。

这是我的Ruby代码:

require 'digest/sha2'

def chunker
  video, array = File.new('video.mp4', 'r'), []
  (0..video.size/1024).each { |i| array[i] = video.read 1024 }
  array
end

video_chunks, sha, digest = chunker, '', Digest::SHA2.new

video_chunks.reverse_each { |chunk| sha = (digest << chunk+sha).to_s }

puts sha

我基本上将视频分成1024个字节的块,然后反向遍历它,得到SHA256总和(currentBlock + lastSha)并将其保存到变量,我在此反向遍历结束时输出。 / p>

这不起作用。

第一个块的SHA256总和(没有附加任何过去的sha)是'f2e208617302c6b089f52b6f27f78a7171b4424c1191989bbf86ed5ab0cbccee',我从一个完全相同的问题的Java程序中知道这一点。这个数字是正确的。但是第二个SHA256总和,即将'f2e2 ......'附加到倒数第二个块的SHA265结果应该是'34b6 ......'并且它输出另一个东西。问题出现在代码“digest&lt;&lt; chunk + sha”中。不知何故,当附加时,会发生一些事情,结果是不正确的。 有任何想法吗? :(

1 个答案:

答案 0 :(得分:2)

不应通过sha生成.to_s,您需要二进制字符串版本。此外,你正在为同一个摘要提供越来越多的块,而你的练习特别是在你自己控制下(即你自己的代码中)做同样事情的过程。

因此,不是维护digest对象,而是在其上调用.to_s来获取每个子哈希,您应该每次使用Digest::SHA2.digest( data )类方法计算新的哈希值

请改为尝试:

video_chunks, sha = chunker, ''

video_chunks.reverse_each { |chunk| sha = Digest::SHA2.digest( chunk+sha ) }

# Convert to hex:
puts sha.unpack('H*').first