0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Kỹ Thuật Padding Trong Mật Mã Đối Xứng AES - Phần 6: Tìm Hiểu về Block Cipher và Tấn Công Padding Oracle

Đăng vào 3 tuần trước

• 3 phút đọc

Chủ đề:

CryptoCryptography

V. Padding Trong Block Cipher và AES

1. Kỹ Thuật Padding

AES-128 mã hóa dữ liệu theo từng khối, mỗi khối có độ dài 16 byte. Tuy nhiên, trong thực tế, chúng ta khó đảm bảo rằng độ dài của thông điệp cần mã hóa sẽ là bội số của 16. Chính vì vậy, cần sử dụng kỹ thuật padding để điều chỉnh độ dài này cho phù hợp với yêu cầu của AES.

Khi độ dài thông điệp không chia hết cho 16, kỹ thuật padding sẽ bổ sung thêm các bytes vào khối cuối để đảm bảo nó đầy đủ độ dài. Điều này cần được thực hiện sao cho vừa bảo mật vừa tương thích với quy trình giải mã.

2. Các Kiểu Padding Phổ Biến

Kỹ thuật padding có thể được phân thành nhiều kiểu khác nhau, bao gồm ZeroPadding, ISO/IEC 7816-4 và PKCS7.

2.1. ZeroPadding

Như tên gọi, phương pháp ZeroPadding đơn giản là thêm các byte có giá trị 0 cho tới khi đạt được độ dài mong muốn:

Copy
data += b'\x00' * (block_size - len(data) % block_size)

2.2. ISO/IEC 7816-4

Kỹ thuật này tương tự như ZeroPadding nhưng bắt đầu bằng byte 80 (hex). Cách thực hiện có thể được sử dụng thư viện Crypto.Util.Padding trong Python:

Copy
padded_data = pad(data, 16, style='iso7816')

2.3. PKCS7

PKCS7 có phần đặc sắc hơn: nếu số byte cần thêm là 0xAB thì tất cả bytes thêm vào sẽ có giá trị AB. Ví dụ:

Copy
data = b'This is a test mess.'
padded_data = pad(data, 16)

3. Tấn Công Padding Oracle

Thách Thức: ECB ORACLE

python Copy
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

KEY = ?
FLAG = ?

@chal.route('/ecb_oracle/encrypt/<plaintext>/')
def encrypt(plaintext):
    plaintext = bytes.fromhex(plaintext)
    padded = pad(plaintext + FLAG.encode(), 16)
    cipher = AES.new(KEY, AES.MODE_ECB)
    try:
        encrypted = cipher.encrypt(padded)
    except ValueError as e:
        return {"error": str(e)}
    return {"ciphertext": encrypted.hex()}

Trong challenge này, chúng ta chỉ có một route mã hóa duy nhất: /ecb_oracle/encrypt/<plaintext>/. Hàm encrypt() sẽ thực hiện padding cho chuỗi đầu vào và trả về ciphertext. Với chế độ mã hóa ECB, mỗi block plaintext sẽ độc lập với nhau.

Khi padding được thêm vào, chuỗi plaintext có thể được hình dung theo dạng A+FLAG+B, cho phép ta tập trung vào block đầu tiên để thực hiện tấn công. Chúng ta có thể lần lượt thử các giá trị của ký tự trong flag bằng cách thay đổi chuỗi A và thu hồi ciphertext tương ứng.

Hàm encrypt_aes_pad

Để thu hồi ciphertext từ route, bạn có thể sử dụng hàm sau:

python Copy
def encrypt_aes_pad(plaintext, url, path):
    plaintext = plaintext.encode().hex()
    r = requests.get(url = url + path % plaintext)
    response = r.text.strip()
    data = json.loads(response)
    return data['ciphertext']

Sau khi có được block đầu tiên của ciphertext, chúng ta có thể nhận diện ký tự đầu tiên của flag bằng cách thử từng ký tự trong bảng từ điển cho đến khi chúng khớp với ciphertext đã lưu trữ.

Tiếp tục với ký tự tiếp theo, thực hiện tương tự và thời gian kết thúc chúng ta sẽ có được toàn bộ flag bằng cách lần lượt brute-force từng ký tự.

VI. Chế Độ CBC (Cipher Block Chaining) Trong Block Cipher và AES

1. So Sánh CBC với ECB

Chế độ mã hóa ECB sử dụng một key duy nhất cho tất cả các khối dữ liệu, điều này có thể làm tăng nguy cơ bị tấn công khi các khối ciphertext giống nhau cho những khối plaintext giống nhau. Để cải thiện tình hình, chế độ CBC đã được phát triển. CBC sử dụng XOR giữa khối plaintext với khối ciphertext trước đó, tạo ra sự phụ thuộc lẫn nhau giữa các khối dữ liệu, nhằm tăng tính ngẫu nhiên trong việc mã hóa.

Khối đầu tiên sẽ XOR với một vector khởi đầu (IV) được sinh ngẫu nhiên, giúp tăng cường bảo mật. Tuy nhiên, CBC cũng có nhược điểm, tức là một lỗi trong một khối sẽ ảnh hưởng đến tất cả các khối sau đó.

Tài Liệu Tham Khảo

source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào