it-swarm-vi.com

Ưu điểm và nhược điểm của Stream vs Block Ciphers

Các thuật toán mã hóa như Blowfish, AES, RC4, DES và Seal được triển khai theo một trong hai loại mật mã. Những lợi thế/bất lợi của các loại mật mã là gì?

66
Eric Warriner

Mặc dù cả hai đều là mật mã đối xứng, nhưng mật mã luồng dựa trên việc tạo ra một khóa mã hóa "vô hạn" và sử dụng mã hóa một bit hoặc byte tại một thời điểm (tương tự như mã đệm một lần), trong khi đó, mật mã khối hoạt động trên các khối dữ liệu lớn hơn (tức là các khối) tại một thời điểm, thường kết hợp các khối để bảo mật bổ sung (ví dụ AES ở chế độ CBC).

  • Mật mã dòng thường nhanh hơn khối, nhưng có giá riêng.
  • Mật mã khối thường đòi hỏi nhiều bộ nhớ hơn, vì chúng hoạt động trên các khối dữ liệu lớn hơn và thường "mang theo" từ các khối trước đó, trong khi đó, mật mã luồng chỉ hoạt động trên một vài bit tại thời điểm chúng có yêu cầu bộ nhớ tương đối thấp (và do đó rẻ hơn triển khai trong các tình huống hạn chế như thiết bị nhúng, phần sụn và phần cứng đặc biệt).
  • Mật mã dòng khó thực hiện chính xác hơn và dễ bị điểm yếu dựa trên việc sử dụng - vì các nguyên tắc tương tự như bộ đệm một lần, dòng khóa có các yêu cầu rất nghiêm ngặt. Mặt khác, đó thường là phần khó khăn và có thể được giảm tải để ví dụ: một hộp bên ngoài.
  • Bởi vì mật mã khối mã hóa toàn bộ một khối tại một thời điểm (và hơn nữa có các chế độ "phản hồi" được khuyến nghị nhất), chúng dễ bị nhiễu hơn khi truyền, đó là nếu bạn làm hỏng một phần dữ liệu, tất cả phần còn lại có thể là không thể phục hồi. Trong khi đó, các byte mật mã luồng được mã hóa riêng lẻ không có kết nối với các khối dữ liệu khác (trong hầu hết các mật mã/chế độ) và thường có hỗ trợ cho các ngắt trên dòng.
  • Ngoài ra, mật mã luồng không cung cấp bảo vệ toàn vẹn hoặc xác thực, trong khi một số mật mã khối (tùy thuộc vào chế độ) có thể cung cấp bảo vệ toàn vẹn, ngoài tính bảo mật.
  • Do tất cả các yếu tố trên, mật mã luồng thường tốt nhất cho các trường hợp lượng dữ liệu không xác định hoặc liên tục - chẳng hạn như luồng mạng. Mặt khác, chặn mật mã hoặc hữu ích hơn khi lượng dữ liệu được biết trước - chẳng hạn như tệp, trường dữ liệu hoặc giao thức yêu cầu/phản hồi, chẳng hạn như HTTP, trong đó độ dài của toàn bộ thông báo đã biết bắt đầu.
48
AviD

Mật mã khối là một thuật toán linh hoạt thực hiện hoán vị phụ thuộc khóa của các giá trị là chuỗi của một số bit cố định (được gọi là "khối"). Nó có thể được sử dụng cho các vai trò khác nhau trong nhiều loại giao thức mật mã. Một vai trò như vậy là mã hóa hàng loạt các luồng dữ liệu dài; để đạt được điều đó, mật mã khối phải được sử dụng với chế độ hoạt động thích hợp (còn gọi là "chế độ xích"), phương thức truyền thống là CBC và chế độ mới hơn hợp thời trang CTR.

Mật mã luồng là một thuật toán chuyên dụng cho mục đích mã hóa hàng loạt các luồng dữ liệu dài. Ý tưởng là, bằng cách làm mất tính linh hoạt của mật mã khối, có thể tạo ra một thuật toán hiệu quả hơn (nghĩa là một cái gì đó mã hóa dữ liệu nhanh hơn).

Cả hai mật mã khối có chế độ mã hóa theo hướng luồng và mật mã luồng, có thể gặp sự cố bảo mật nếu cùng một khóa được sử dụng hai lần, cho hai luồng riêng biệt, mà không có một mức phù hợp, duy nhất/ngẫu nhiên Vector khởi tạo. Đối với mã hóa CBC, IV phải là một chuỗi bit ngẫu nhiên đồng nhất mới, có cùng kích thước so với một khối, cho mỗi thông báo mới. Mật mã dòng tốt cũng chấp nhận IV. Một mật mã luồng truyền thống được gọi là RC4 không có IV (đặc điểm kỹ thuật của nó không nêu rõ vị trí hoặc cách IV có thể được chèn), dẫn đến tình trạng lộn xộn và đặt tên xấu cho Khái niệm về mật mã dòng.

Để biết các mật mã luồng mới hơn, an toàn hơn (và nhanh hơn), hãy xem danh mục eSTREAM . Các thuật toán này đã trải qua một phân tích khá kỹ lưỡng bởi nhiều nhà mật mã và được coi là "khá an toàn".

Một mật mã luồng có thể được chuyển đổi thành một Trình tạo số giả ngẫu nhiên bằng cách mã hóa một chuỗi dài các byte có giá trị 0. Trên thực tế, nhiều mật mã luồng (nhưng không phải tất cả) hoạt động bên trong bằng cách là PRNG, tạo ra một chuỗi dài các byte giả ngẫu nhiên phụ thuộc khóa, sau đó được kết hợp (bằng bitwise XOR) với dữ liệu để mã hóa (hoặc giải mã), vì vậy mã hóa 0 byte sau đó tương đương với việc bỏ qua XOR hoàn toàn. Do đó, mật mã luồng thường được sử dụng làm PRNG tùy chỉnh.

26
Thomas Pornin

Một lợi thế của mật mã luồng chưa được đề cập trước đây là chúng không cần đệm (mật mã khối hoạt động trên các khối hoàn chỉnh, vì vậy nếu bạn không có đủ dữ liệu, bạn phải tạo thêm một số dữ liệu nào đó). Và thật bất ngờ (không thực sự, mật mã là lĩnh vực mà Murphy ở khắp mọi nơi), việc đệm có thể được thực hiện sai, như ví dụ trong ví dụ Thực hành Padding Oracle Attacks .

Ngoài ra, tính bảo mật của mật mã khối phụ thuộc khá nhiều vào chế độ hoạt động của chúng, đôi khi bạn vẫn thấy ECB được sử dụng ở đây và ở đó và nó không tốt hơn nhiều so với không có tiền điện tử.

Về cơ bản, bạn không thể nói cái này tốt hơn cái kia, người ta phải nhìn vào một hệ thống mật mã hoàn chỉnh để đưa ra phán quyết bảo mật.

9
Bruno Rohée

Stream Ciphers bảo vệ dữ liệu văn bản gốc với một luồng bit ngẫu nhiên (thường là với a XOR vì nó có thể đảo ngược dễ dàng). Nếu bạn có dữ liệu 128 bit, bạn sẽ sử dụng chuỗi psedurandom 128 bit ( chìa khóa của bạn) để mã hóa.

Khối mật mã bảo vệ dữ liệu văn bản đơn giản một khối tại một thời điểm với cùng một phép chuyển đổi (dựa trên khóa). Vì vậy, bạn có dữ liệu 128 bit của mình, mật mã phá vỡ nó thành các khối (như 4 khối 32 bit) và áp dụng cùng một phép biến đổi cho mỗi khối có được 4 khối được mã hóa, kết hợp sẽ tạo thành mật mã cuối cùng.

Tất nhiên vì Block Cyphers này an toàn hơn nhưng đắt tiền khi sử dụng về độ phức tạp phần cứng liên quan. Stream Ciphers nhanh hơn và "rẻ" nhưng chúng có thể dễ bị vấn đề bảo mật nếu được triển khai không chính xác.

1
gbr