Files

60 lines
3.1 KiB
Python

import base64
import sys
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
AES_KEY = b"KeLy8g7qjmnbgWP1" # 16 bytes = AES-128
contents = [
"HOmbh7KuceD2H18yBv2Hh8Wo+yZVzYtFBkY3J3eo1Pnyu0jacX6mgzwzbPzTC4KdHQia8sK5T0jfKnHPGnH5Cqc8Y+bgzN2iPXoNvgDX4OEtuyoCa+R7HknO7dLcWWPKN7Lr28x4fteCEw8YolioaFDHoZkpKla51b0qutO5wUMcfCYkg/lw8cOPB2jJwjqS1Y0YL01zaUgu24ZJHC7SwldSNtD++IgipCZtItTfgS1NmN7Qs/O/mUqox+x1AJb345vm5qhg6Q/5Bp9zXyWtn41i255CfPaW+gcqUqA248eF1BZrnzF3IkrDgysaFx/38nDYPByPO2rznmygwjjq00yhMWTHe3cKu2h3OjZvMuzuBfzE7CQwcx59/UQPBs0Fig9EPqQwHQeCRSvl1tYPm+rqlwlC+l3s3rYDaWLa3WgGrN+3HwgTGdZmJV3qajvvhxKT/BZN1zl7EfMHpu52CtM0+yrnbqWEP9heVnNJ6a8=",
"HOmbh7KuceD2H18yBv2Hh8Wo+yZVzYtFBkY3J3eo1Pnyu0jacX6mgzwzbPzTC4KdHQia8sK5T0jfKnHPGnH5Cqc8Y+bgzN2iPXoNvgDX4OEtuyoCa+R7HknO7dLcWWPKN7Lr28x4fteCEw8YolioaO39sVqYiFSEGMa11fUhPPgq7Kx6u3SnVsiRD5ZMgqi1Nn9qBND01zsAC6WBb+/XbOYoUbMBAtwhHrzyZPBnL0emWpKPOcyU9Wr0RQbfgXkuEWAl+RM4Son1LM0wZh18aGmXfQY2lMvj/qugOXwRCadmBIeHQwkk3nkE0w67Fqn3532zCdf2GhAFMHt5jV0D3w==",
"HOmbh7KuceD2H18yBv2Hh8Wo+yZVzYtFBkY3J3eo1Pnyu0jacX6mgzwzwzbPzTC4KdHQia8sK5T0jfKnHPGnH5Cqc8Y+bgzN2iPXoNvgDX4OEtuyoCa+R7HknO7dLcWWPKN7Lr28x4fteCEw8YolioaDTUtiqVaipMPgSYqyEJJfK20PAzpQq4+V2Z6ppHMLRZ+H3TdNdtJPU8lkSbz4uZ02wH9SUonvWhXZOoddgLsakqnF2dB/Zq3M3Qb27LD6LoaZxOaJm+ry6K14diT5soLLhQiGFP8rBeCQ5ZdG2YlTgNPZG0+eKcB0T4sq8lvLtVYU0MLE+hWDcyuNfNYS+RNss0V6e9m1JkoIVq1A8mlr3DnWZHa1QZrnTEj59HVofAI1uKreMp/cx0VHntx0T4jzzalxfnpMi81J7OHnmzK3sb4yX9xuLVQoanyHgKoHmXUsByKtRRallEmVm7ImQb5Ybd4IfMU5ljdK7BoXv1cAeqYsEXBmlXm1bcYvzEWh7e"
]
def try_decrypt(ciphertext_b64, key, mode_name, iv=None):
try:
ct = base64.b64decode(ciphertext_b64)
if mode_name == "ECB":
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend())
elif mode_name == "CBC":
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
else:
return None
decryptor = cipher.decryptor()
pt = decryptor.update(ct) + decryptor.finalize()
# Try PKCS7 unpad
unpadder = padding.PKCS7(128).unpadder()
pt = unpadder.update(pt) + unpadder.finalize()
return pt.decode("utf-8")
except Exception as e:
return None
for i, ct_b64 in enumerate(contents, 1):
print(f"\n========== Payload {i} ==========")
# ECB
result = try_decrypt(ct_b64, AES_KEY, "ECB")
if result:
print(f"[AES-128-ECB]\n{result}\n")
continue
# CBC with common IVs
ivs = {
"key as IV": AES_KEY,
"zeros": b"\x00" * 16,
}
# Maybe IV is first 16 bytes of ciphertext
ct_bytes = base64.b64decode(ct_b64)
if len(ct_bytes) >= 16:
ivs["first 16 bytes of cipher"] = ct_bytes[:16]
found = False
for iv_name, iv in ivs.items():
result = try_decrypt(ct_b64, AES_KEY, "CBC", iv)
if result:
print(f"[AES-128-CBC, IV={iv_name}]\n{result}\n")
found = True
break
if not found:
print("[尝试失败] ECB 和常见 CBC IV 均无法解密,可能需要其他算法或参数。")