[UIT Hacking Contest – S Season] – Encrypting Twice (Japan – Crypto 200pts)

Description:

I used this encryption scheme: C = Enc(K2, Enc(K1, M))
But somehow I lost 2 bytes of each key. Can you help me recovering the message ?

Plain 1 = ‘Somehow I lost 2 bytes of each key’
Cipher 1 = ‘8lmWpP4K1zlNDVIre6htrld9Omh+Mc61CJpP/ajgdNf0gg==’
Decrypt this : ‘9H+vgsIj23RhSEpkYbJt6B96Y3FyJoq2C5pF+uvlMdH+iXQv’
K1 = ’13abcf8a0d6cbb61fd3f7bc3a4ee’.decode(‘hex’) + 2 bytes
K2 = ‘a6d43c9d371f67a984acf3c94a91’.decode(‘hex’) + 2 bytes

Source:

Lúc đầu mình bị lừa khi thấy code này khác với code RC4 mình biết (cụ thể ở line 18), mình cứ nghĩ sẽ tìm cách recover được key, cuối cùng không được, mất hơi nhiều time, mất luôn first solve, hơi buồn một tẹo.

Bài này mình giải bằng cách áp dụng meet-in-the-middle attack, đại ý thế này:

Nếu attacker có một/nhiều cặp plaintext P và ciphertext C thỏa mãn: C = enc(k2, enc(k1, P)) và P = dec(k1, dec(k2, C)) thì attacker có thể tìm được k1 và k2 bằng cách:

  1. mã hóa plaintext bằng tất cả các key k1 có thể;
  2. giải mã ciphertext bằng tất cả các key k2 có thể;
  3. kết quả nào trả về trùng nhau thì rất có thể là đó là cặp key k1 và k2 cần tìm.

Để tăng tốc thì mình dùng thêm một lookup table.

Kết quả mình có hai key (hex encoded) k1 = “13abcf8a0d6cbb61fd3f7bc3a4ee2045” và k2 = “a6d43c9d371f67a984acf3c94a9121cb”, dùng hai key này decrypt ciphertext BTC cho sẽ có flag.

p.s: Một cách giải khác của bạn Viết Trung:

C = enc(k2, enc(k1,M)) => C = keyStream1^M^keyStream2

=> keyStream1^keyStream2 = C1^M1

=> M2 = C2^keyStream1^keyStream2 = flag.