2010-01-21 11 views

Trả lời

4

Nhìn vào documentation, dường như đó là tùy thuộc vào bạn, người sử dụng thư viện, để pad dữ liệu cho mình. Tài liệu nói rằng kích thước khối cho AES luôn là 16 byte, vì vậy bạn cần phải pad dữ liệu đến bội số của 16 byte.

Cách thực hiện đệm phụ thuộc vào loại dữ liệu. Đối với chuỗi, cách tiếp cận tốt nhất có thể là mã hóa chuỗi thành một mã hóa cụ thể và sau đó lấy độ dài của mã hóa đó. Bằng cách đó bạn không dựa vào tất cả các ký tự được biểu thị bằng một điểm mã 8 bit:

plaintext = data.encode('utf-8') 
l = len(plaintext) 
ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE)) 

Cách tiếp cận tương tự sẽ hoạt động khi bạn là dữ liệu của một mảng byte.

0 sẽ hoạt động tốt như PADDING_BYTE, nhưng bạn cần phải cẩn thận để loại bỏ phần đệm khi bạn giải mã dữ liệu. Nó có thể đáng giá trong khi bao gồm độ dài của dữ liệu trong bản mã, ví dụ: thêm chiều dài của dữ liệu vào bản rõ trước khi mã hóa, nhưng sau đó bạn cần phải nhảy qua một số vòng để đảm bảo rằng phần đệm được tạo chính xác.

Chỉnh sửa: oh vâng, giống như liên kết RFC GregS đề cập đến, cách tiêu chuẩn để xử lý vấn đề độ dài là sử dụng độ dài của đệm làm byte đệm. I E. nếu bạn cần 6 byte đệm padding byte là 0x06. Lưu ý rằng nếu bạn không cần bất kỳ đệm nào, bạn phải thêm toàn bộ khối byte đệm (16 byte của 0xa0) để bạn có thể khôi phục thư chính xác.

3

Sử dụng lược đồ đệm tiêu chuẩn, chẳng hạn như lược đồ được nêu trong PKCS-5, mục 6.1.1 bướC# 4 (thay thế 8 trong ví dụ đó bằng 16 nếu bạn đang sử dụng AES).