· 7 years ago · May 26, 2018, 09:28 AM
1from secrets import token_bytes
2from hashlib import sha1
3from sha import compression, initial_values, pad
4
5iv = b''.join(i.to_bytes(4, 'big') for i in initial_values)
6
7secret_key = token_bytes(51)
8def keyed_hash(msg):
9 return sha1(secret_key + msg).digest()
10
11# 下ã®hash1 ã®å€¤ãŠã‚ˆã³éµé•·+平文ã®é•·ã• (55 bytes) ãŒæ”»æ’ƒè€…ã«æ—¢çŸ¥ã®ã¨ã
12hash1 = keyed_hash(b'neko')
13
14# hash2ã¯ç§˜å¯†éµã‚’知らãšã«è¨ˆç®—ã§ãる。
15# ã¾ãšã¯ç§˜å¯†éµã‚’使ã£ã¦è¨ˆç®—ã—ã¦ã¿ã‚ˆã†ã€‚
16hash2 = keyed_hash(b'neko\x80\x00\x00\x00\x00\x00\x00\x01\xb8b')
17
18# ç¶šã„ã¦ç§˜å¯†éµãªã—ã«è¨ˆç®—ã—ã¦ã¿ã‚‹
19hash2_ = compression(hash1, pad(b'b', 520))
20
21print("秘密éµã‚ã‚Šã§æ™®é€šã«è¨ˆç®—:\n\t" + hash2.hex())
22print("秘密éµãªã—ã§è¨ˆç®— (length extension攻撃):\n\t" + hash2_.hex())