krone
VIP Members
-
26/07/2016
-
141
-
259 bài viết
AES Encryption / Decryption (AES-CTR) - Examples in Python
Chúng ta hãy minh họa các khái niệm mã hóa AES và giải mã AES thông qua Python.
Ví dụ đầu tiên dưới đây sẽ minh họa một mã hóa AES dựa trên mật khẩu đơn giản (PBKDF2 + AES-CTR) mà không có xác thực tin nhắn (mã hóa không được xác thực). Ví dụ tiếp theo sẽ thêm xác thực tin nhắn (sử dụng chế độ AES-GCM), sau đó sẽ thêm mật khẩu vào khoá dẫn (AES-256-GCM + Scrypt).
Simple AES-CTR Example
Hãy bắt đầu với mã hóa không xác thực AES-256-CTR đơn giản.
Cài đặt thư viện Python pyaes và pbkdf2
Đầu tiên, cài đặt các thư viện Python thực hiện thuật toán mã hóa khóa đối xứng AES:
Tiếp theo, cài đặt thư viện Python pbkdf2 thực hiện thuật toán dẫn xuất mật khẩu PBKDF2:
pip install pbkdf2
Password với Key derivation
Đầu tiên bắt đầu bằng Key derivation: từ mật khẩu đến khóa mã hóa 256 bit.
Đoạn mã trên lấy được khóa 256 bit bằng thuật toán Key Derivation PBKDF2 từ mật khẩu s3cr3t * c0d3. Nó sử dụng một salt derivation mật khẩu ngẫu nhiên (128-bit). Salt này nên được lưu trữ trong đầu ra, cùng với ciphertext, bởi vì không có nó, decryption key không thể được lấy lại và việc giải mã sẽ không thể thực hiện được.
Key derivation bao gồm 64 chữ số hex (32 byte), đại diện cho số nguyên 256 bit. Sẽ khác nếu bạn chạy đoạn mã trên nhiều lần, bởi vì một salt ngẫu nhiên được sử dụng mỗi lần. Nếu bạn sử dụng cùng một salt, cùng một khóa sẽ được chuyển hoá ở đầu ra.
AES Encryption (CTR Block Mode)
Tiếp theo, tạo một vectơ ban đầu 256 bit ngẫu nhiên (IV) cho mode AES CTR block và thực hiện mã hóa AES-256-CTR:
Đầu ra từ mã trên có thể trông như thế này:
Ciphertext bao gồm 38 chữ số hex (19 byte, 152 bit). Đây là kích thước của dữ liệu đầu vào: “How do you know that?”
Lưu ý rằng sau khi mã hóa AES-CTR, vectơ ban đầu (IV) phải được lưu trữ cùng với Ciphertext, vì nếu không có nó, việc decrypt sẽ là không thể. IV nên được tạo ngẫu nhiên cho mỗi mã hóa AES (không được mã hóa cứng) để bảo mật cao hơn.
AES Decryption (CTR Block Mode)
Bây giờ hãy xem cách decrypt một Ciphertext bằng thuật toán AES-CTR-256. Đầu vào bao gồm bản mã + encryption key + IV cho bộ đếm CTR. Đầu ra là plaintext. Mã này khá đơn giản:
Đầu ra của ở trên nên như thế này:
Lưu ý rằng object aes nên được khởi tạo lại, bởi vì thuật toán CTR block mode giữ trạng thái bên trong thay đổi theo thời gian. Cũng lưu ý rằng đoạn mã trên không thể phát hiện key sai, ciphertext sai hoặc IV sai. Nếu bạn sử dụng khóa không chính xác để giải mã bản mã, bạn sẽ nhận được một văn bản không thể đọc được. Điều này được hiển thị rõ ràng bằng mã dưới đây:
Đầu ra của nỗ lực giải mã không chính xác ở trên có thể như sau:
Next topic: AES Encryption / Decryption (AES-CTR) - Examples in Python
Source: cryptobook.nakov.com
Ví dụ đầu tiên dưới đây sẽ minh họa một mã hóa AES dựa trên mật khẩu đơn giản (PBKDF2 + AES-CTR) mà không có xác thực tin nhắn (mã hóa không được xác thực). Ví dụ tiếp theo sẽ thêm xác thực tin nhắn (sử dụng chế độ AES-GCM), sau đó sẽ thêm mật khẩu vào khoá dẫn (AES-256-GCM + Scrypt).
Simple AES-CTR Example
Hãy bắt đầu với mã hóa không xác thực AES-256-CTR đơn giản.
Cài đặt thư viện Python pyaes và pbkdf2
Đầu tiên, cài đặt các thư viện Python thực hiện thuật toán mã hóa khóa đối xứng AES:
pip install pyaes
Tiếp theo, cài đặt thư viện Python pbkdf2 thực hiện thuật toán dẫn xuất mật khẩu PBKDF2:
pip install pbkdf2
Password với Key derivation
Đầu tiên bắt đầu bằng Key derivation: từ mật khẩu đến khóa mã hóa 256 bit.
Đoạn mã trên lấy được khóa 256 bit bằng thuật toán Key Derivation PBKDF2 từ mật khẩu s3cr3t * c0d3. Nó sử dụng một salt derivation mật khẩu ngẫu nhiên (128-bit). Salt này nên được lưu trữ trong đầu ra, cùng với ciphertext, bởi vì không có nó, decryption key không thể được lấy lại và việc giải mã sẽ không thể thực hiện được.
AES encryption key: b'd982275da0f232588e27ade0d570afc1670cc306e891605865e75c07e222cdb5'
Key derivation bao gồm 64 chữ số hex (32 byte), đại diện cho số nguyên 256 bit. Sẽ khác nếu bạn chạy đoạn mã trên nhiều lần, bởi vì một salt ngẫu nhiên được sử dụng mỗi lần. Nếu bạn sử dụng cùng một salt, cùng một khóa sẽ được chuyển hoá ở đầu ra.
AES Encryption (CTR Block Mode)
Tiếp theo, tạo một vectơ ban đầu 256 bit ngẫu nhiên (IV) cho mode AES CTR block và thực hiện mã hóa AES-256-CTR:
Đầu ra từ mã trên có thể trông như thế này:
Encrypted: b'd6c4f66ff5772a5c5bc4f0eb8f5f5a182960ed31b4'
Ciphertext bao gồm 38 chữ số hex (19 byte, 152 bit). Đây là kích thước của dữ liệu đầu vào: “How do you know that?”
Lưu ý rằng sau khi mã hóa AES-CTR, vectơ ban đầu (IV) phải được lưu trữ cùng với Ciphertext, vì nếu không có nó, việc decrypt sẽ là không thể. IV nên được tạo ngẫu nhiên cho mỗi mã hóa AES (không được mã hóa cứng) để bảo mật cao hơn.
AES Decryption (CTR Block Mode)
Bây giờ hãy xem cách decrypt một Ciphertext bằng thuật toán AES-CTR-256. Đầu vào bao gồm bản mã + encryption key + IV cho bộ đếm CTR. Đầu ra là plaintext. Mã này khá đơn giản:
Đầu ra của ở trên nên như thế này:
Decrypted: b'How do you know that?'
Lưu ý rằng object aes nên được khởi tạo lại, bởi vì thuật toán CTR block mode giữ trạng thái bên trong thay đổi theo thời gian. Cũng lưu ý rằng đoạn mã trên không thể phát hiện key sai, ciphertext sai hoặc IV sai. Nếu bạn sử dụng khóa không chính xác để giải mã bản mã, bạn sẽ nhận được một văn bản không thể đọc được. Điều này được hiển thị rõ ràng bằng mã dưới đây:
Đầu ra của nỗ lực giải mã không chính xác ở trên có thể như sau:
Wrongly decrypted: b'\x94\xc7\xf2\x8b\xd1\x81|\x0e\xb9\xa0^ym\xdb\x03w\xbby-\x8b\x04'
Next topic: AES Encryption / Decryption (AES-CTR) - Examples in Python
Source: cryptobook.nakov.com