1

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

读取一个视频文件,将其分成 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 字节的块,然后反向遍历它,获取 (currentBlock + lastSha) 的 SHA256 和并将其保存到一个变量中,我在反向遍历结束时输出该变量。

这不起作用。

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

4

1 回答 1

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
于 2013-10-18T18:40:55.963 回答