暗号学コースのプログラミング課題として、次の問題があります。
ビデオ ファイルを読み取り、1KB ブロックに分割し、最後のブロックを取得し、SHA256 サムを取得し、その合計を最後から 2 番目のブロックに追加し、結果のブロックの 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 プログラムからこれを知っています。その金額は正しいです。しかし、最後から 2 番目のブロックに「f2e2...」を追加した SHA265 の結果である 2 番目の SHA256 合計は、「34b6...」である必要があり、別のものを出力しています。問題はコード「ダイジェスト << チャンク + sha」で発生します。どういうわけか、追加すると何かが起こり、結果のshaが正しくありません。何か案は?:(