36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
import base64
|
|
import random
|
|
from Crypto.Cipher import AES
|
|
|
|
KEY = random.randbytes(16)
|
|
# KEY =b'\xaab\xa65z"\xac\xb1,a\xff1\xdb6}\xb0' # The key should match the server's key
|
|
IV = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" # The IV can be random
|
|
|
|
def pkcs7(message: bytes, block_size: int = 16) -> bytes:
|
|
gap_size = block_size - (len(message) % block_size)
|
|
return message + bytes([gap_size] * gap_size)
|
|
|
|
|
|
def cbc_mac(message: bytes, iv: bytes, key: bytes) -> bytes:
|
|
cipher = AES.new(key, AES.MODE_CBC, iv)
|
|
message = pkcs7(message)
|
|
last_block = cipher.encrypt(message)[-16:]
|
|
return last_block
|
|
|
|
# Craft the message
|
|
message = b"type=recrets&number=1337"
|
|
|
|
# Calculate the MAC
|
|
mac = cbc_mac(message, IV, KEY)
|
|
|
|
# Base64 encode the message, IV, and MAC
|
|
encoded_message = base64.b64encode(message).decode('utf-8')
|
|
encoded_iv = base64.b64encode(IV).decode('utf-8')
|
|
encoded_mac = base64.b64encode(cbc_mac(message, IV,KEY)).decode('utf-8')
|
|
|
|
# Final request to send
|
|
final_message = f"{encoded_message};{encoded_iv};{encoded_mac}"
|
|
|
|
print(final_message)
|
|
|
|
# MAC verification failed: expected afb7f5f307ea507b631d964e089a820a, got a0b0b48844a7deaf9d917a5f11ae0359 |