Công cụ giải mã AES

Giải mã bản mã AES-128/192/256: dữ liệu OpenSSL "Salted__" (U2FsdGVkX1…), kết quả CryptoJS, hoặc khóa hex thô + IV ở CBC, GCM, CTR, CFB, OFB, ECB.

Kết quả ở định dạng OpenSSL "Salted__" mã hóa Base64: 8 byte salt ngẫu nhiên rồi đến bản mã. Khóa và IV được dẫn xuất từ mật khẩu và salt, nên cùng một văn bản sẽ cho kết quả khác nhau mỗi lần. Lệnh tương đương:

openssl enc -aes-256-cbc -d -md md5 -a -A -k '…'

Chạy hoàn toàn trong trình duyệt. Dữ liệu của bạn không bao giờ bị tải lên.

Giải mã AES là gì?

Giải mã bản mã AES ngay trong trình duyệt. Công cụ đọc định dạng "Salted__" của OpenSSL (chuỗi Base64 bắt đầu bằng U2FsdGVkX1) do openssl enc và CryptoJS.AES.encrypt(text, passphrase) tạo ra, hoặc bản mã thô với khóa và IV hex ở chế độ CBC, CFB, CTR, OFB, ECB hay GCM có xác thực. Phần đệm được kiểm tra, nên khóa sai sẽ được báo thay vì trả về dữ liệu rác.

Cách sử dụng Giải mã AES

  1. Chọn đúng Nguồn khóa đã dùng khi mã hóa: Mật khẩu (tương thích OpenSSL) cho dữ liệu U2FsdGVkX1… ("Salted__"), hoặc Khóa thô + IV (hex) cho bản mã thô.
  2. Nhập mật khẩu (và cùng phương thức Dẫn xuất khóa), hoặc khóa và IV dạng hex.
  3. Đặt cùng Chế độ và Đệm (padding) như bên gửi rồi dán Bản mã (Base64 hoặc Hex).
  4. Bấm Giải mã. Giữ kết quả dạng Văn bản (UTF-8), hoặc chuyển sang Hex nếu bản rõ là dữ liệu nhị phân.

Ví dụ

Đầu vào
U2FsdGVkX19HHh9Vv809WnL0M8IWPgnpihePLw8JpDQ= (passphrase "secret", AES-256, CBC, EVP_BytesToKey MD5)
Đầu ra
Hello, World!

Bản mã được tạo bằng openssl enc -aes-256-cbc -md md5 -a -k secret.

Khi nào nên dùng Giải mã AES

Dùng để đọc dữ liệu mã hóa bằng OpenSSL hoặc CryptoJS, gỡ lỗi vì sao ứng dụng không giải mã được, hoặc kiểm tra vector kiểm thử. Bạn cần đúng mật khẩu hoặc khóa – công cụ không thể khôi phục khóa bị mất hay phá AES. Nếu bản mã đến từ sản phẩm khác (file ZIP, cơ sở dữ liệu, trình quản lý mật khẩu), nó thường có định dạng container riêng và sẽ không giải mã được ở đây.

Giải mã AES hoạt động như thế nào

Với dữ liệu mật khẩu, 16 byte đầu phải là Salted__ cộng salt 8 byte. Khóa và IV được dẫn xuất lại từ mật khẩu và salt bằng EVP_BytesToKey (MD5) hoặc PBKDF2-HMAC-SHA256 với số vòng lặp của bạn, đúng như openssl enc -d, rồi phần còn lại được giải mã. Với khóa thô, khóa và IV hex được dùng trực tiếp. Sau khi giải mã CBC/ECB, phần đệm PKCS#7 được kiểm tra từng byte – không khớp gần như luôn có nghĩa là sai khóa, IV, chế độ hoặc độ dài khóa. Ở GCM, thẻ 16 byte ở cuối được Web Crypto xác minh trước khi hiển thị bất kỳ bản rõ nào.

Các Trường Hợp Sử Dụng Phổ Biến

  • Giải mã chuỗi U2FsdGVkX1… từ openssl enc -aes-256-cbc -a
  • Kiểm tra giá trị mã hóa bằng CryptoJS.AES.encrypt trong ứng dụng web
  • Xác minh bản mã AES-GCM + thẻ do backend tạo ra
  • Tìm xem độ dài khóa hoặc chế độ nào đã được dùng bằng cách thử các thiết lập khả dĩ
  • Giải mã dữ liệu kiểm thử khi gỡ lỗi API hoặc tích hợp

Lưu Ý Bảo Mật

Việc giải mã diễn ra cục bộ; mật khẩu và bản rõ không bao giờ rời khỏi thiết bị của bạn. Chỉ GCM mới chứng minh được dữ liệu chưa bị sửa đổi.

Câu Hỏi Thường Gặp

"Invalid padding" hoặc "sai mật khẩu" nghĩa là gì?

Khối cuối sau khi giải mã không kết thúc bằng đệm PKCS#7 hợp lệ. Hãy kiểm tra mật khẩu, độ dài khóa (128/192/256), chế độ và phương thức dẫn xuất khóa (MD5 hay PBKDF2 và số vòng lặp). OpenSSL 1.1+ mặc định dùng -md sha256 không kèm -pbkdf2, điều này không được hỗ trợ ở đây – hãy mã hóa lại với -md md5 hoặc -pbkdf2.

Có giải mã được kết quả của CryptoJS không?

Có. CryptoJS.AES.encrypt(text, "passphrase").toString() dùng cùng định dạng Salted__ với AES-256-CBC và EVP_BytesToKey/MD5, đúng là thiết lập mặc định ở đây.

Bản mã của tôi không bắt đầu bằng U2FsdGVkX1. Giờ làm sao?

Vậy là nó được mã hóa bằng khóa thô. Đổi Nguồn khóa sang Khóa thô + IV (hex) và nhập khóa cùng IV mà chương trình đã dùng. Một số chương trình đặt IV ở đầu bản mã; hãy tách phần đó ra và nhập vào ô IV.

Vì sao kết quả giải mã trông như ký tự ngẫu nhiên?

Ở chế độ dòng (CTR, CFB, OFB) không có phần đệm để kiểm tra, nên khóa sai cho ra byte ngẫu nhiên. Công cụ báo chúng là UTF-8 không hợp lệ; hãy chuyển kết quả sang Hex nếu bạn mong đợi dữ liệu nhị phân.

Khám phá thêm danh mục