it-swarm-vi.com

Liệu mã hóa đối xứng cung cấp tính toàn vẹn dữ liệu?

Giả sử tôi có một máy chủ mã hóa tệp bằng khóa đối xứng, ví dụ: AES-CBC và gửi nó cho khách hàng giải mã nó. Điều đó có cung cấp tính toàn vẹn dữ liệu khi được giải mã không? Hoặc có thể ai đó giả mạo tệp trong khi nó vẫn được mã hóa và sau đó khi máy khách giải mã nó, tạo ra một tệp sửa đổi?

Tôi thường thấy tính toàn vẹn và tính xác thực của dữ liệu được thảo luận về mặt sử dụng chữ ký số hoặc MAC, nhưng không bao giờ trong bối cảnh mã hóa. Tôi cũng đã thấy các điểm chuẩn cho thấy mã hóa đắt hơn băm, nhưng đó không phải là cân nhắc chính của tôi.

CẬP NHẬT

Tôi đã thử một thử nghiệm, trong đó tôi đã sử dụng công cụ openssl trong Linux để mã hóa một tệp. Sau đó, tôi đã thử sửa đổi tệp theo nhiều cách khác nhau (thay đổi một byte, xóa một byte, nối thêm một byte). Trong mọi trường hợp, khi tôi thử giải mã, tôi sẽ nhận được thông báo "giải mã xấu". Các lệnh tôi đã sử dụng là:

openssl enc -aes-128-cbc -in test -out test.enc
openssl enc -d -aes-128-cbc -in test.enc -out test.dec
18
88keys

Mã hóa đối xứng không không cung cấp tính toàn vẹn. Số lượng kiểm soát mà kẻ tấn công có thể có trên dữ liệu được mã hóa phụ thuộc vào loại mã hóa; và một số chi tiết cụ thể của một số chế độ mã hóa có thể khiến kẻ tấn công gặp khó khăn hơn một chút nếu anh ta muốn sửa đổi phẫu thuật. Với CBC, kẻ tấn công có thể lật bất kỳ bit nào anh ta muốn, miễn là anh ta không ngại chuyển đổi hàng tá byte khác thành rác ngẫu nhiên.

chế độ mã hóa gần đây kết hợp mã hóa đối xứng và tính toàn vẹn được kiểm tra (với một MAC ). Các chế độ này đảm bảo cả tính bảo mật và toàn vẹn. AES-CBC là không một trong số họ. Nếu bạn muốn một chế độ mã hóa với tính toàn vẹn, tôi khuyên bạn nên EAX .

Cập nhật: liên quan đến thử nghiệm của bạn: CBC là chế độ trong đó độ dài dữ liệu nguồn phải là bội số của chiều dài khối mật mã khối (16 byte, đối với AES) . Vì một thông báo đầu vào tùy ý có thể có bất kỳ độ dài nào, một số padding được thêm vào: một vài byte, với nội dung cụ thể để chúng có thể được xóa một cách rõ ràng khi giải mã. Trong trường hợp của bạn, OpenSSL được phàn nàn rằng, khi giải mã, nó không tìm thấy một cấu trúc đệm thích hợp. Tuy nhiên, nếu kẻ tấn công không thay đổi 32 byte dữ liệu được mã hóa cuối cùng, phần đệm sẽ không bị phá hủy, do đó, những thay đổi của tất cả trừ 32 byte cuối cùng sẽ không bị phát hiện. Và ngay cả trong 32 byte cuối cùng, vẫn có những cách để tránh sự phát hiện với xác suất không quá nhỏ.

19
Tom Leek

Mã hóa CBC không cung cấp tính toàn vẹn dữ liệu. Đây là lý do tại sao:

Sửa một số khóa k (không biết kẻ tấn công). Đặt E (k, -) và D (k, -) là các chức năng mã hóa và giải mã trần của một số mật mã khối. Đặt p là một số khối đơn. Tôi sẽ biểu thị XOR bởi +. Sau khi sửa một số IV, chúng tôi mã hóa như sau:

c = E (k, p + IV).

Sau đó, chúng tôi gửi IV và c qua dây. Để giải mã, chúng tôi tính toán

p = D (k, c) + IV.

(Lưu ý rằng điều này tương đương với câu lệnh D (k, c) = IV + p.)

Bây giờ, giả sử rằng kẻ tấn công biết một cặp plaintext/cexttext. Hãy biểu thị chúng là p và (IV, c), như trên. Bây giờ, giả sử rằng kẻ tấn công muốn tạo bản mã sẽ giải mã cho một số khối văn bản khác mà anh ta chọn - nói p '. Tôi khẳng định rằng (IV + p + p ', c) giải mã thành p'. Tại sao?

Vâng, chúng tôi chỉ làm theo quy trình giải mã ở trên, thay thế IV bằng IV + p + p '. Chúng ta có

D (k, c) + (IV + p + p ') = (IV + p) + (IV + p + p') = p '.

Thật thú vị, chế độ ECB không dễ bị ảnh hưởng bởi vấn đề này (mặc dù tôi cũng không tán thành việc sử dụng nó).

12
iamtheneal

Mã hóa AES-CBC không cung cấp tính toàn vẹn. Tùy thuộc vào cách nó được triển khai và sử dụng, có thể tình cờ phát hiện một số sửa đổi ngẫu nhiên đối với bản mã, nhưng nó không chống lại việc giả mạo độc hại với bản mã .

Mã hóa mà không cần xác thực là một trong những lỗi phổ biến nhất trong việc sử dụng mật mã . Nó đã dẫn đến các lỗ hổng nghiêm trọng trong nhiều hệ thống, bao gồm ASP.NET, mã hóa XML, Amazon EC2, JavaServer Faces, Ruby trên Rails, OWASP ESAPI, IPSEC và WEP. Xem liên kết trước đó để biết thêm thông tin.

Cách khắc phục: Bạn nên sử dụng sơ đồ mã hóa được xác thực (không phải AES-CBC), như EAX, hoặc bạn nên sử dụng mã xác thực thư, như CMAC, trong chế độ mã hóa-sau đó xác thực.

Nếu bạn định tự mình thực hiện mật mã, tôi khuyến khích bạn đọc câu hỏi ở đây có tên Bài học kinh nghiệm và hiểu sai về mã hóa và mật mã học để giúp bạn tránh một số lỗi phổ biến nhất. Sử dụng mã hóa mà không cần xác thực là một trong số đó.

9
D.W.

Mật mã đối xứng tự chúng không cung cấp tính toàn vẹn vì chúng không phát hiện các sửa đổi độc hại hoặc vô tình đối với bản mã; giải mã sẽ xuất ra một cái gì đó khác với bản gốc và trừ khi điều này dẫn đến một số vi phạm giao thức đối với tải trọng được giải mã thì bạn có vấn đề về tính toàn vẹn.

Giải pháp là bọc văn bản bên trong các gói bao gồm dữ liệu có thể được sử dụng để xác thực tính toàn vẹn của gói, điển hình là tổng kiểm tra dựa trên hàm băm ( chỉnh sửa: khóa HMAC). Đây là những gì được thực hiện, ví dụ: cho bảo mật lớp vận chuyển.

Đây là một ví dụ của sơ đồ bảo vệ bản rõ được sử dụng trong giao thức vận chuyển byte bảo mật của Nền tảng Versile (từ chối trách nhiệm: Tôi tham gia phát triển VP).

Chỉnh sửa: Tôi nhận ra việc đóng gói thư là quá mức cần thiết cho kịch bản của bạn bao gồm một tệp hoàn chỉnh, và vì vậy tốt hơn hết bạn chỉ nên thêm một MAC có khóa bản mã. Đối với các định dạng được bảo vệ gói, như D.W. chỉ ra vấn đề chi tiết và "tổng kiểm tra" phải được thực hiện dưới dạng MAC có khóa.

5
Versile