2013-10-18 86 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