Mô tả
Summary
Điều cần thiết là các khóa trong thuật toán khóa đối xứng phải là các byte ngẫu nhiên, thay vì mật khẩu hoặc dữ liệu có thể dự đoán khác. Các byte ngẫu nhiên phải được tạo bằng bộ tạo số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG). Nếu các khóa có thể dự đoán được theo bất kỳ cách nào, thì mức độ bảo mật của mật mã sẽ bị giảm và kẻ tấn công có được quyền truy cập vào bản mã có thể giải mã nó.
Chỉ vì một khóa trông giống như nó được hình thành từ các byte ngẫu nhiên, không có nghĩa là nó nhất thiết phải như vậy. Trong trường hợp này, khóa đã được lấy từ một mật khẩu đơn giản bằng cách sử dụng hàm băm, điều này làm cho bản mã có thể bị bẻ khóa.
Hướng dẫn giải
- Đọc source code thì thấy khóa được là một từ ngẫu nhiên nào đó ở trong từ điển. Tải về từ điển từ link.
- Nhận thấy từ điển cũng khá ít từ, tiến hành brute force:
from Crypto.Cipher import AES
import hashlib
import random
enc_flag = "c92b7734070205bdf6c0087a751466ec13ae15e6f1bcdd3f3a535ec0f4bbae66"
def decrypt(ciphertext, password_hash):
ciphertext = bytes.fromhex(ciphertext)
key = bytes.fromhex(password_hash)
cipher = AES.new(key, AES.MODE_ECB)
try:
decrypted = cipher.decrypt(ciphertext)
except ValueError as e:
return {"error": str(e)}
return {"plaintext": decrypted.hex()}
with open("./words.txt") as f:
words = [w.strip() for w in f.readlines()]
for word in words:
key = bytes.hex(hashlib.md5(word.encode()).digest())
flag = bytes.fromhex(decrypt(enc_flag, key)['plaintext'])
if(flag.__contains__(b'crypto{')):
print(flag)
Cờ
Success
crypto{k3y5__r__n07__p455w0rdz?}