NPST 11. Informasjonsdeling: multiple AES-GCM keys

Task description

NISSENS verksted har mottatt en mystisk melding og litt kode for å dekryptere meldingen. Noen alver i førstelinjen har sett på det, og blir ikke helt kloke. De mistenker at kun denne ene hemmeligheten ikke er nok. Kanskje er det andre som sitter på mer info?

- Mellomleder

filer.zip

Notes

Unzipping gives us dekrypter_melding.py and melding.enc. Here’s the python file:

from Crypto.Cipher import AES
from base64 import b64decode
import json

key = "???"

with open("melding.enc", "rb") as f:
    try:
        data = json.loads(f.read())
        nonce = b64decode(data["nonce"])
        ciphertext = b64decode(data["ciphertext"])
        tag = b64decode(data["tag"])
        cipher = AES.new(key, AES.MODE_GCM, nonce = nonce)
        plaintext = cipher.decrypt_and_verify(ciphertext, tag)
        print("Dekryptert melding: " + plaintext.decode('utf-8'))
    except (ValueError, KeyError):
        print("Oisann, noe gikk galt!")

Solution

from Crypto.Cipher import AES
from Crypto.Util.number import long_to_bytes, bytes_to_long
from base64 import b64decode
import json

keys = [
    bytes.fromhex("980daad49738f76b80c8fafb0673ff1b"),
    bytes.fromhex("a3c5a5a81ebc62c6144a9dc1ae5cce11"),
    bytes.fromhex("fc78e6fee2138b798e1e51ed15e0a109")
]

key = long_to_bytes(bytes_to_long(keys[0]) ^ bytes_to_long(keys[1]) ^ bytes_to_long(keys[2]))

with open("melding.enc", "rb") as f:
    data = json.loads(f.read())
    nonce = b64decode(data["nonce"])
    ciphertext = b64decode(data["ciphertext"])
    tag = b64decode(data["tag"])
    cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
    plaintext = cipher.decrypt_and_verify(ciphertext, tag)
    print("Dekryptert melding: " + plaintext.decode('utf-8'))

Flag: NSM{9c7cac722d55da1dbfa13025d85efeed45e9ddea2796c0e5ea2fda81ea4de17d}