2013-10-18 46 views
1

由于在加密过程中,我有以下问题编程任务:SHA2和字节管理红宝石

读取视频文件,在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,并将其保存到变量,我在这个反向遍历结束时输出。

这不起作用。

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

+1

确保您追加散列的原始字节而不是十六进制编码表示(反之亦然;我不知道哪种方式是正确的)。 – ntoskrnl

回答

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 
+0

我不知道摘要类的方法,这就是为什么我在每次迭代中调用对象的重置。我仍然是一个红宝石小菜,但你的答案清除了很多。谢谢!! – acib708