Cryptography解题报告:Message Integrity

这次的题目就比较简单,只涉及到SHA-256的使用。装个Pycrypto库就能用了。解题思路就是从后面的block往前面block添加Hash值,复杂度O(n)。

我花的时间主要在怎么读取文件,还有各种解码encode decode,哎,基础不扎实,该用的时候只能现场查资料学习。
题目指向的两个stream文件就是视频文件:

  • 6 - 1 - Introduction (11 min).mp4
  • 6 - 2 - Generic birthday attack (16 min).mp4

下载这两个视频文件,先测试一下后面那个视频文件是否输出H0为教授给出的hash值:

03c08f4ee0b576fe319338139c045c89c3e8e9409633bea29442e21425006ea8

我写的代码,其中视频文件是video_2.mp4

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Crypto.Hash import SHA256
BLOCK_SIZE = 1024
hash_stream = ''

def calc_sha(f):
    global hash_stream
    h = SHA256.new()
    h.update(f)
    hash_stream = h.digest()

with open('/tmp/vedio_2.mp4', 'rb') as f:
    len_ = len(f.read())
    amount_of_blocks = len_ / BLOCK_SIZE
    len_of_last_block = len_ % BLOCK_SIZE

    f.seek(-len_of_last_block, 2) # 最后一个block
    calc_sha(f.read(len_of_last_block))
    i = amount_of_blocks - 1  # 倒数第二个block

    while i >= 0:
        f.seek(i * BLOCK_SIZE, 0)
        merge = f.read(BLOCK_SIZE) + hash_stream
        calc_sha(merge)
        i -= 1

    print hash_stream.encode('hex')

执行结果与hash值一致,那么自己将open函数中的视频文件名改为video_1.mp4即可得出正确答案。