作为密码学课程的编程作业,我有以下问题:
读取一个视频文件,将其分成 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 不正确。有任何想法吗?:(