Làm cách nào để chọn chế độ mã hóa AES (CBC ECB CTR OCB CFB)?


480

Những người trong số họ được ưa thích trong hoàn cảnh nào?

Tôi muốn xem danh sách crtieria đánh giá cho các chế độ khác nhau và có thể là một cuộc thảo luận về khả năng áp dụng của từng tiêu chí.

Ví dụ, tôi nghĩ một trong những tiêu chí là "kích thước của mã" để mã hóa và giải mã, điều này rất quan trọng đối với các hệ thống nhúng mã vi mô, như bộ điều hợp mạng 802.11. NẾU mã được yêu cầu để triển khai CBC nhỏ hơn nhiều so với yêu cầu đối với TLB (Tôi không biết điều này là đúng, đó chỉ là một ví dụ), sau đó tôi có thể hiểu tại sao chế độ với mã nhỏ hơn sẽ được ưu tiên. Nhưng nếu tôi đang viết một ứng dụng chạy trên máy chủ và thư viện AES tôi đang sử dụng thực hiện cả CBC và CTR, thì tiêu chí này không liên quan.

Xem ý tôi là gì bởi "danh sách các tiêu chí đánh giá và khả năng áp dụng của từng tiêu chí" ??

Đây không thực sự liên quan đến lập trình nhưng nó liên quan đến thuật toán.


22
"Đây không thực sự liên quan đến lập trình nhưng nó liên quan đến thuật toán." Thuật toán có thể được biểu diễn bằng toán học. Lập trình máy tính có thể được trình bày bằng toán học. Câu hỏi của bạn là về lập trình máy tính.
Tyler Gillies

41
"Đây không thực sự liên quan đến lập trình nhưng nó liên quan đến thuật toán." Thuật toán có thể được biểu diễn bằng toán học và thị trường chứng khoán có thể được biểu diễn bằng toán học, câu hỏi của bạn là về thị trường chứng khoán. / xin lỗi vì sự mỉa mai, nhưng trong khi kết luận rất rõ ràng đúng, thì lập luận rất rõ ràng sai
Shien

Phụ thuộc vào sự hiểu biết về các mối quan hệ bạn đăng ký. Một cái gì đó không nhất thiết phải chỉ liên quan đến khái niệm này hay khái niệm khác.
Bryan Grace

Câu trả lời:


325
  • Không nên sử dụng ECB nếu mã hóa nhiều hơn một khối dữ liệu bằng cùng một khóa.

  • CBC, OFB và CFB tương tự nhau, tuy nhiên OFB / CFB tốt hơn vì bạn chỉ cần mã hóa và không giải mã, có thể tiết kiệm không gian mã.

  • CTR được sử dụng nếu bạn muốn song song tốt (ví dụ: tốc độ), thay vì CBC / OFB / CFB.

  • Chế độ XTS là phổ biến nhất nếu bạn đang mã hóa dữ liệu có thể truy cập ngẫu nhiên (như đĩa cứng hoặc RAM).

  • OCB là chế độ tốt nhất, vì nó cho phép mã hóa và xác thực trong một lần duy nhất. Tuy nhiên, có bằng sáng chế về nó ở Mỹ.

Điều duy nhất bạn thực sự phải biết là ECB sẽ không được sử dụng trừ khi bạn chỉ mã hóa 1 khối. XTS nên được sử dụng nếu bạn đang mã hóa dữ liệu truy cập ngẫu nhiên và không phải là luồng.

  • Bạn LUÔN LUÔN sử dụng IV duy nhất mỗi khi bạn mã hóa và chúng phải là ngẫu nhiên . Nếu bạn không thể đảm bảo chúng là ngẫu nhiên , hãy sử dụng OCB vì nó chỉ yêu cầu nonce chứ không phải IV và có sự khác biệt rõ ràng. Một nonce không giảm bảo mật nếu mọi người có thể đoán người tiếp theo, IV có thể gây ra vấn đề này.

65
CBC, OFB và CFB không giống nhau.
Jonathan Leffler

22
TLB có thể song song hóa vì bạn có thể chia thông điệp thành các phần, mỗi đoạn có một phạm vi giá trị truy cập được liên kết với nó và mã hóa (hoặc giải mã) từng đoạn một cách độc lập. Ngược lại, CFB dựa vào đầu ra từ khối trước là một trong những đầu vào tiếp theo, do đó, nó là tuần tự nghiêm ngặt và vốn không song song. Tương tự cho các chế độ khác được đề cập.
Jonathan Leffler

9
Ngay cả khi bạn chỉ mã hóa một khối, ECB không nên được sử dụng nếu bạn sẽ mã hóa một khối đó nhiều lần (thậm chí có thể nhiều hơn một lần) bằng cùng một khóa.
yfeldblum

23
... Làm thế nào để một câu trả lời có nội dung "CBC, OFB và CFB giống hệt nhau" không có một downvote nào?
Michael Mrozek

30
GCM rất giống với OCB (hiệu suất và các thuộc tính khác), nhưng nó không bị đóng gói bởi bất kỳ bằng sáng chế nào, vì vậy nó là lựa chọn tốt nhất. Nhược điểm duy nhất là việc triển khai rất phức tạp - nhưng bạn không phải lo lắng về điều đó nếu bạn sử dụng thư viện.
ntoskrnl

409

Vui lòng cân nhắc lâu dài và chăm chỉ nếu bạn không thể thực hiện mật mã của riêng mình

Sự thật xấu xí của vấn đề là nếu bạn hỏi câu hỏi này, có lẽ bạn sẽ không thể thiết kế và thực hiện một hệ thống an toàn.

Hãy để tôi minh họa quan điểm của mình: Hãy tưởng tượng bạn đang xây dựng một ứng dụng web và bạn cần lưu trữ một số dữ liệu phiên. Bạn có thể chỉ định cho mỗi người dùng một ID phiên và lưu trữ dữ liệu phiên trên máy chủ trong ID phiên ánh xạ băm cho dữ liệu phiên. Nhưng sau đó bạn phải đối phó với trạng thái phiền phức này trên máy chủ và nếu đến một lúc nào đó bạn cần nhiều hơn một máy chủ thì mọi thứ sẽ trở nên lộn xộn. Vì vậy, thay vào đó bạn có ý tưởng lưu trữ dữ liệu phiên trong cookie ở phía máy khách. Bạn sẽ mã hóa nó tất nhiên để người dùng không thể đọc và thao tác dữ liệu. Vậy bạn nên sử dụng chế độ nào? Đến đây bạn đọc câu trả lời hàng đầu (xin lỗi vì đã đưa bạn ra khỏi myforwik). Khối đầu tiên được bảo hiểm - ECB - không dành cho bạn, bạn muốn mã hóa nhiều hơn một khối, khối tiếp theo - CBC - nghe có vẻ hay và bạn không cần sự song song của TLB, bạn không cần truy cập ngẫu nhiên, vì vậy không có XTS và bằng sáng chế là Pita, vì vậy không có OCB. Sử dụng thư viện tiền điện tử của bạn, bạn nhận ra rằng bạn cần một số phần đệm bởi vì bạn chỉ có thể mã hóa bội số của kích thước khối. Bạn chọnPKCS7 vì nó được định nghĩa trong một số tiêu chuẩn mật mã nghiêm trọng. Sau khi đọc ở đâu đó rằng CBC có thể được bảo mật an toàn nếu được sử dụng với IV ngẫu nhiên và mật mã khối an toàn, bạn yên tâm mặc dù bạn đang lưu trữ dữ liệu nhạy cảm của mình ở phía máy khách.

Nhiều năm sau khi dịch vụ của bạn thực sự phát triển đến quy mô đáng kể, một chuyên gia bảo mật CNTT liên lạc với bạn trong một tiết lộ có trách nhiệm. Cô ấy nói với bạn rằng cô ấy có thể giải mã tất cả các cookie của bạn bằng cách sử dụng một cuộc tấn công sấm sét , bởi vì mã của bạn tạo ra một trang lỗi nếu phần đệm bị hỏng theo cách nào đó.

Đây không phải là một tình huống giả định: Microsoft đã có lỗ hổng chính xác này trong ASP.NET cho đến vài năm trước.

Vấn đề là có rất nhiều cạm bẫy liên quan đến mật mã và cực kỳ dễ dàng để xây dựng một hệ thống có vẻ an toàn cho giáo dân nhưng lại tầm thường để phá vỡ một kẻ tấn công có hiểu biết.

Phải làm gì nếu bạn cần mã hóa dữ liệu

Đối với các kết nối trực tiếp, hãy sử dụng TLS (đảm bảo kiểm tra tên máy chủ của chứng chỉ và chuỗi nhà phát hành). Nếu bạn không thể sử dụng TLS, hãy tìm API cấp cao nhất mà hệ thống của bạn cung cấp cho nhiệm vụ của bạn và chắc chắn rằng bạn hiểu các đảm bảo mà nó cung cấp và quan trọng hơn là những gì nó không đảm bảo. Đối với ví dụ ở trên một khung như Play cung cấp các phương tiện lưu trữ phía máy khách , nó sẽ không làm mất hiệu lực dữ liệu được lưu trữ sau một thời gian và nếu bạn thay đổi trạng thái phía máy khách, kẻ tấn công có thể khôi phục trạng thái trước đó mà bạn không nhận thấy.

Nếu không có sự trừu tượng hóa mức cao có sẵn, hãy sử dụng thư viện tiền điện tử cấp độ cao. Một ví dụ nổi bật là NaCl và một triển khai di động với nhiều ràng buộc ngôn ngữ là Natri . Sử dụng một thư viện như vậy bạn không cần phải quan tâm đến các chế độ mã hóa, v.v. nhưng bạn thậm chí phải cẩn thận hơn về các chi tiết sử dụng so với mức độ trừu tượng cao hơn, như không bao giờ sử dụng một lần mở hai lần.

Nếu vì một lý do nào đó, bạn không thể sử dụng thư viện tiền điện tử cấp cao, chẳng hạn vì bạn cần tương tác với hệ thống hiện tại theo một cách cụ thể, không có cách nào để giáo dục bản thân kỹ lưỡng. Tôi khuyên bạn nên đọc Kỹ thuật mã hóa của Ferguson, Kohno và Schneier . Xin đừng dại dột tin rằng bạn có thể xây dựng một hệ thống an toàn mà không cần nền tảng cần thiết. Mật mã học cực kỳ tinh vi và không thể kiểm tra tính bảo mật của hệ thống.

So sánh các chế độ

Chỉ mã hóa:

  • Các chế độ yêu cầu đệm : Giống như trong ví dụ, đệm nói chung có thể nguy hiểm vì nó mở ra khả năng đệm tấn công sấm sét. Cách phòng thủ dễ nhất là xác thực mọi tin nhắn trước khi giải mã. Xem bên dưới.
    • ECB mã hóa từng khối dữ liệu một cách độc lập và cùng một khối văn bản gốc sẽ dẫn đến cùng một khối bản mã. Hãy xem hình ảnh tux mã hóa ECB trên trang Wikipedia ECB để biết tại sao đây là một vấn đề nghiêm trọng. Tôi không biết bất kỳ trường hợp sử dụng nào mà ECB sẽ được chấp nhận.
    • CBC có IV và do đó cần ngẫu nhiên mỗi khi tin nhắn được mã hóa, thay đổi một phần tin nhắn yêu cầu mã hóa lại mọi thứ sau khi thay đổi, lỗi truyền trong một khối bản mã phá hủy hoàn toàn bản rõ và thay đổi giải mã của khối tiếp theo, giải mã có thể song song / mã hóa không thể, bản rõ có thể uốn được ở một mức độ nhất định - đây có thể là một vấn đề .
  • Các chế độ mật mã luồng : Các chế độ này tạo ra một luồng dữ liệu giả ngẫu nhiên có thể có hoặc không phụ thuộc vào bản rõ. Tương tự như các mật mã luồng nói chung, luồng ngẫu nhiên giả được tạo ra được XOR với bản rõ để tạo bản mã. Vì bạn có thể sử dụng bao nhiêu bit của luồng ngẫu nhiên mà bạn muốn, bạn không cần phải đệm. Nhược điểm của sự đơn giản này là mã hóa hoàn toàn dễ uốn, có nghĩa là việc giải mã có thể được thay đổi bởi kẻ tấn công theo bất kỳ cách nào anh ta thích như đối với bản rõ p1, bản mã c1 và luồng giả ngẫu nhiên r và kẻ tấn công có thể chọn một sự khác biệt sao cho việc giải mã một bản mã c2 = c1⊕d là p2 = p1⊕d, vì p2 = c2⊕r = (c1 ⊕ d) ⊕ r = d (c1 ⊕ r). Ngoài ra, luồng ngẫu nhiên giả giống nhau không bao giờ được sử dụng hai lần như đối với hai bản mã c1 = p1⊕r và c2 = p2⊕r, kẻ tấn công có thể tính xor của hai bản rõ là c1⊕c2 = p1⊕r⊕p2⊕r = p1⊕p2. Điều đó cũng có nghĩa là việc thay đổi tin nhắn đòi hỏi phải mã hóa lại hoàn toàn, nếu tin nhắn ban đầu có thể bị kẻ tấn công lấy được. Tất cả các chế độ mã hóa hơi sau đây chỉ cần hoạt động mã hóa của mật mã khối, do đó tùy thuộc vào mật mã, điều này có thể tiết kiệm một số không gian (mã silicon hoặc mã máy) trong môi trường cực kỳ hạn chế.
    • CTR rất đơn giản, nó tạo ra một luồng ngẫu nhiên giả độc lập với văn bản gốc, các luồng ngẫu nhiên giả khác nhau có được bằng cách đếm từ các nonces / IV khác nhau được nhân với độ dài tin nhắn tối đa để ngăn chặn sự trùng lặp, sử dụng mã hóa tin nhắn nonces có thể không có tính ngẫu nhiên của mỗi tin nhắn, việc giải mã và mã hóa được hoàn thành song song, các lỗi truyền chỉ ảnh hưởng đến các bit sai và không có gì khác
    • OFB cũng tạo ra một luồng ngẫu nhiên giả độc lập với văn bản gốc, các luồng ngẫu nhiên giả khác nhau có được bằng cách bắt đầu với một IV không ngẫu nhiên hoặc IV ngẫu nhiên khác nhau cho mỗi tin nhắn, không thể mã hóa hay giải mã song song, như với TLB sử dụng mã hóa tin nhắn phi mã có thể không có trên mỗi tin nhắn tính ngẫu nhiên, như với các lỗi truyền TLB chỉ ảnh hưởng đến các bit sai và không có gì khác
    • Luồng ngẫu nhiên giả của CFB phụ thuộc vào bản rõ, cần có một IV không ngẫu nhiên hoặc IV ngẫu nhiên khác nhau cho mỗi tin nhắn, như với TLB và OFB sử dụng mã hóa tin nhắn phi lực mà không có tính ngẫu nhiên của tin nhắn, không thể giải mã song song / mã hóa phá hủy khối sau, nhưng chỉ ảnh hưởng đến các bit sai trong khối hiện tại
  • Chế độ mã hóa ổ đĩa : Các chế độ này được chuyên dùng để mã hóa dữ liệu bên dưới sự trừu tượng hóa hệ thống tệp. Vì lý do hiệu quả, việc thay đổi một số dữ liệu trên đĩa chỉ phải yêu cầu ghi lại tối đa một khối đĩa (512 byte hoặc 4kib). Chúng nằm ngoài phạm vi của câu trả lời này vì chúng có các kịch bản sử dụng khác nhau rất nhiều so với các câu hỏi khác. Đừng sử dụng chúng cho bất cứ điều gì ngoại trừ mã hóa đĩa cấp khối . Một số thành viên: XEX, XTS, LRW.

Mã hóa xác thực:

Để ngăn chặn các cuộc tấn công sấm sét và thay đổi đối với bản mã, người ta có thể tính mã xác thực tin nhắn (MAC) trên bản mã và chỉ giải mã nó nếu nó không bị giả mạo. Điều này được gọi là mã hóa-then-mac và nên được ưu tiên cho bất kỳ thứ tự nào khác . Ngoại trừ rất ít trường hợp sử dụng tính xác thực cũng quan trọng như tính bảo mật (sau này là mục đích của mã hóa). Các lược đồ mã hóa được xác thực (với dữ liệu liên quan (AEAD)) kết hợp hai quá trình mã hóa và xác thực thành một chế độ mã hóa khối cũng tạo ra một thẻ xác thực trong quy trình. Trong hầu hết các trường hợp, điều này dẫn đến cải thiện tốc độ.

  • CCM là sự kết hợp đơn giản giữa chế độ CTR và CBC-MAC. Sử dụng hai mã hóa mã hóa khối cho mỗi khối, nó rất chậm.
  • OCB nhanh hơn nhưng bị vướng bởi các bằng sáng chế. Tuy nhiên, đối với phần mềm miễn phí (như tự do) hoặc phi quân sự, người giữ bằng sáng chế đã cấp giấy phép miễn phí .
  • GCM là sự kết hợp rất nhanh nhưng phức tạp của chế độ CTR và GHASH, một MAC trên trường Galois với 2 ^ 128 yếu tố. Việc sử dụng rộng rãi trong các tiêu chuẩn mạng quan trọng như TLS 1.2 được phản ánh bởi một hướng dẫn đặc biệt mà Intel đã giới thiệu để tăng tốc tính toán GHASH.

Sự giới thiệu:

Xem xét tầm quan trọng của xác thực, tôi sẽ đề xuất hai chế độ mã hóa khối sau cho hầu hết các trường hợp sử dụng (ngoại trừ mục đích mã hóa ổ đĩa): Nếu dữ liệu được xác thực bằng chữ ký không đối xứng, hãy sử dụng GCM.


214
"Nếu bạn cần hỏi câu hỏi này, có lẽ bạn không biết đủ về mật mã để thực hiện một hệ thống an toàn." - Bạn nói đúng, nhưng bạn có nhận ra rằng đặt câu hỏi là cách mọi người học? Vì vậy, có thể thư giãn một chút.
Robert MacLean

70
@RobertMacLean Đúng, nhưng trái với rất nhiều lĩnh vực khác trong CNTT, bạn sẽ không nhận được bảo mật ngay khi thử và lỗi. Trong khi với thiết kế web, khả năng mở rộng ứng dụng, v.v. bạn có thể chủ động kiểm tra các yêu cầu của mình, kiểm tra các khía cạnh bảo mật từ khó đến không thể. Thật không may, đó là một bài học hiếm khi được dạy. Hầu hết các tài nguyên cho bạn biết mật mã hoạt động như thế nào và không phải là vô số cách nó thất bại trong thực tế mà bạn không hề biết về nó. Cách duy nhất là biết nhiều về chủ đề này. Và đó là tinh thần của bài viết:
Perseids

8
Hoặc đầu tư đủ thời gian để tìm hiểu kỹ về mật mã hoặc tránh nó càng nhiều càng tốt và sử dụng sự trừu tượng mạnh mẽ. Và trong chủ đề học cách mật mã phá vỡ đoạn đầu tiên có nhiều chủ đề hơn so với mô tả về các chế độ.
Perseids

33
Trừ đi một: tiêu đề bắt đầu là sai; nó sẽ nói "Nếu bạn hỏi câu hỏi này, bạn đang đi đúng hướng, hãy tiếp tục và bạn sẽ xuất sắc!"
Henrik

11
@FerminSilva: Đúng, nhưng một khía cạnh khác của đối số là việc sử dụng các giải pháp đúng và được thử nghiệm thường dễ dàng hơn so với sao chép-dán mã mật mã. Ví dụ: khi tất cả những gì bạn muốn làm là nói chuyện với máy chủ của bạn từ một ứng dụng điện thoại thông minh, việc thiết lập proxy ngược Apache với chứng chỉ TLS Hãy mã hóa và viết https://your.serverở mọi nơi trong ứng dụng của bạn sẽ đơn giản hơn nhiều so với phát minh ra một số giao thức trao đổi khóa và có được các thư viện mật mã ở cả hai bên để làm việc trơn tru.
Perseids

36

Một phân tích chính thức đã được Phil Rogaway thực hiện vào năm 2011, tại đây . Mục 1.6 đưa ra một bản tóm tắt mà tôi phiên âm ở đây, thêm phần nhấn mạnh của riêng tôi in đậm (nếu bạn không kiên nhẫn, thì khuyến nghị của anh ấy là sử dụng chế độ CTR, nhưng tôi khuyên bạn nên đọc đoạn văn của tôi về tính toàn vẹn của tin nhắn so với mã hóa bên dưới).

Lưu ý rằng hầu hết trong số này yêu cầu IV là ngẫu nhiên, có nghĩa là không thể dự đoán được và do đó nên được tạo bằng bảo mật mật mã. Tuy nhiên, một số chỉ yêu cầu "nonce", không yêu cầu tài sản đó mà thay vào đó chỉ yêu cầu rằng nó không được sử dụng lại. Do đó, các thiết kế dựa trên nonce ít bị lỗi hơn các thiết kế không (và tin tôi đi, tôi đã thấy nhiều trường hợp CBC không được thực hiện với lựa chọn IV thích hợp). Vì vậy, bạn sẽ thấy rằng tôi đã thêm đậm khi Rogaway nói điều gì đó như "tính bảo mật không đạt được khi IV là nonce", điều đó có nghĩa là nếu bạn chọn IV bảo mật bằng mật mã (không thể đoán trước), thì không vấn đề gì. Nhưng nếu bạn không, thì bạn đang mất các thuộc tính bảo mật tốt. Không bao giờ sử dụng lại IV cho bất kỳ chế độ nào trong số này.

Ngoài ra, điều quan trọng là phải hiểu sự khác biệt giữa tính toàn vẹn của thông điệp và mã hóa. Mã hóa che giấu dữ liệu, nhưng kẻ tấn công có thể sửa đổi dữ liệu được mã hóa và kết quả có thể được phần mềm của bạn chấp nhận nếu bạn không kiểm tra tính toàn vẹn của tin nhắn. Mặc dù nhà phát triển sẽ nói "nhưng dữ liệu đã sửa đổi sẽ trở lại như rác sau khi giải mã", một kỹ sư bảo mật giỏi sẽ tìm thấy xác suất rác gây ra hành vi bất lợi trong phần mềm, và sau đó anh ta sẽ biến phân tích đó thành một cuộc tấn công thực sự. Tôi đã thấy nhiều trường hợp sử dụng mã hóa nhưng tính toàn vẹn của thông điệp thực sự cần thiết hơn mã hóa. Hiểu những gì bạn cần.

Tôi nên nói rằng mặc dù GCM có cả tính toàn vẹn về mã hóa và thông điệp, nhưng nó là một thiết kế rất dễ vỡ: nếu bạn sử dụng lại IV, bạn sẽ bị lừa - kẻ tấn công có thể khôi phục khóa của bạn. Các thiết kế khác ít dễ hỏng hơn, vì vậy cá nhân tôi rất ngại giới thiệu GCM dựa trên số lượng mã hóa kém mà tôi đã thấy trong thực tế.

Nếu bạn cần cả hai, tính toàn vẹn của thông điệp và mã hóa, bạn có thể kết hợp hai thuật toán: thông thường chúng ta thấy CBC với HMAC, nhưng không có lý do gì để buộc mình vào CBC. Điều quan trọng cần biết là mã hóa trước, sau đó MAC nội dung được mã hóa , không phải cách khác. Ngoài ra, IV cần phải là một phần của tính toán MAC.

Tôi không nhận thức được vấn đề IP.

Bây giờ đến những thứ tốt từ Giáo sư Rogaway:

Chặn các chế độ mật mã, mã hóa nhưng không toàn vẹn tin nhắn

ECB : Một mã hóa khối, chế độ mã hóa các thông điệp là bội số của n bit bằng cách mã hóa riêng từng đoạn n bit. Các thuộc tính bảo mật là yếu , phương pháp rò rỉ sự bình đẳng của các khối trên cả vị trí khối và thời gian. Có giá trị di sản đáng kể và có giá trị như một khối xây dựng cho các chương trình khác, nhưng chế độ không đạt được bất kỳ mục tiêu bảo mật mong muốn chung nào theo quyền riêng của mình và phải được sử dụng một cách thận trọng; ECB không nên được coi là một chế độ bảo mật của mục đích chung của thành phố .

CBC : Một sơ đồ mã hóa dựa trên IV, chế độ được bảo mật như một sơ đồ mã hóa xác suất, đạt được sự không thể phân biệt từ các bit ngẫu nhiên, giả sử IV ngẫu nhiên. Tính bảo mật không đạt được nếu IV chỉ là một nonce , cũng như nếu nó không được mã hóa theo cùng khóa được sử dụng bởi lược đồ, như tiêu chuẩn gợi ý không chính xác. Mật mã rất dễ uốn. Không có bảo mật tấn công mã hóa (CCA) được chọn. Bảo mật bị mất vì sự hiện diện của một nhà tiên tri chính xác cho nhiều phương pháp đệm. Mã hóa không hiệu quả từ vốn đã nối tiếp. Được sử dụng rộng rãi, các thuộc tính bảo mật chỉ riêng tư của chế độ dẫn đến việc sử dụng sai thường xuyên. Có thể được sử dụng như một khối xây dựng cho các thuật toán CBC-MAC. Tôi có thể xác định không có lợi thế quan trọng so với chế độ CTR.

CFB : Một sơ đồ mã hóa dựa trên IV, chế độ được bảo mật như một sơ đồ mã hóa xác suất, đạt được sự không thể phân biệt từ các bit ngẫu nhiên, giả sử IV ngẫu nhiên. Tính bảo mật không đạt được nếu IV có thể dự đoán được , cũng như nếu nó được tạo bởi một nonce được mã hóa theo cùng khóa được sử dụng bởi lược đồ, như tiêu chuẩn gợi ý không chính xác. Mật mã có thể dễ uốn. Không bảo mật CCA. Mã hóa không hiệu quả từ vốn đã nối tiếp. Lược đồ phụ thuộc vào một tham số s, 1 ≤ s ≤ n, thường là s = ​​1 hoặc s = 8. Không hiệu quả khi cần một lệnh gọi mã hóa để xử lý chỉ các bit s. Chế độ đạt được một thuộc tính tự đồng bộ hóa thú vị của Cameron; việc chèn hoặc xóa bất kỳ số lượng ký tự s-bit nào vào bản mã chỉ tạm thời phá vỡ giải mã chính xác.

OFB : Một sơ đồ mã hóa dựa trên IV, chế độ được bảo mật như một sơ đồ mã hóa xác suất, đạt được sự không thể phân biệt từ các bit ngẫu nhiên, giả sử IV ngẫu nhiên. Bảo mật không đạt được nếu IV là nonce, mặc dù một chuỗi IV cố định (ví dụ: bộ đếm) hoạt động tốt. Mật mã rất dễ uốn. Không bảo mật CCA. Mã hóa và giải mã không hiệu quả từ vốn đã nối tiếp. Tự nhiên mã hóa các chuỗi có độ dài bit bất kỳ (không cần đệm). Tôi có thể xác định không có lợi thế quan trọng so với chế độ CTR.

TLB : Một sơ đồ mã hóa dựa trên IV, chế độ đạt được sự không thể phân biệt với các bit ngẫu nhiên giả sử IV không. Là một lược đồ không dựa trên an toàn, chế độ cũng có thể được sử dụng làm lược đồ mã hóa xác suất, với IV ngẫu nhiên. Hoàn toàn thất bại về quyền riêng tư nếu một nonce được sử dụng lại trên mã hóa hoặc giải mã. Tính song song của chế độ thường làm cho nó nhanh hơn, trong một số cài đặt nhanh hơn nhiều so với các chế độ bảo mật khác. Một khối xây dựng quan trọng cho các chương trình mã hóa xác thực. Nhìn chung, thường là cách tốt nhất và hiện đại nhất để đạt được mã hóa chỉ riêng tư.

XTS : Một sơ đồ mã hóa dựa trên IV, chế độ hoạt động bằng cách áp dụng một mã hóa khối có thể điều chỉnh (bảo mật như một PRP mạnh) cho mỗi đoạn n bit. Đối với các thư có độ dài không chia hết cho n, hai khối cuối được xử lý đặc biệt. Việc sử dụng chế độ chỉ được phép là để mã hóa dữ liệu trên thiết bị lưu trữ có cấu trúc khối. Độ rộng hẹp của PRP cơ bản và xử lý kém các khối cuối cùng phân đoạn là vấn đề. Hiệu quả hơn nhưng ít mong muốn hơn một mã hóa bảo mật PRP (khối rộng) sẽ là.

MAC (tin nhắn toàn vẹn nhưng không mã hóa)

ALG1 Vang6 : Một bộ sưu tập MAC, tất cả đều dựa trên CBC-MAC. Quá nhiều đề án. Một số được chứng minh an toàn như VIL PRF, một số là PRF PHIM và một số không có bảo mật có thể chứng minh được. Một số kế hoạch thừa nhận các cuộc tấn công gây thiệt hại. Một số chế độ được ghi ngày. Việc tách khóa không được chú ý đầy đủ cho các chế độ có nó. Không nên được thông qua hàng loạt, nhưng có thể chọn lọc các phương án tốt nhất của người Hồi giáo là có thể. Cũng không nên chấp nhận bất kỳ chế độ nào trong số này, có lợi cho CMAC. Một số MAC ISO 9797-1 được tiêu chuẩn hóa và sử dụng rộng rãi, đặc biệt là trong ngân hàng. Phiên bản sửa đổi của tiêu chuẩn (ISO / IEC FDIS 9797-1: 2010) sẽ sớm được phát hành [93].

CMAC : Một MAC dựa trên CBC-MAC, chế độ này có thể được bảo mật một cách rõ ràng (đến giới hạn sinh nhật) dưới dạng PRF (VIL) (giả sử mã hóa cơ bản là một PRP tốt). Về cơ bản chi phí tối thiểu cho một chương trình dựa trên CBCMAC. Bản chất nối tiếp vốn là một vấn đề trong một số miền ứng dụng và việc sử dụng mã hóa 64 bit sẽ thỉnh thoảng phải nhập lại khóa. Sạch hơn bộ sưu tập MAC 9797-1 của MAC.

HMAC : MAC dựa trên hàm băm mật mã thay vì mã hóa khối (mặc dù hầu hết các hàm băm mật mã đều dựa trên blockciphers). Cơ chế thích các giới hạn bảo mật có thể chứng minh mạnh mẽ, mặc dù không từ các giả định ưa thích. Nhiều biến thể liên quan chặt chẽ trong tài liệu phức tạp đạt được sự hiểu biết về những gì đã biết. Không có cuộc tấn công gây thiệt hại đã từng được đề xuất. Được chuẩn hóa và sử dụng rộng rãi.

GMAC : MAC không dựa trên MAC là trường hợp đặc biệt của GCM. Kế thừa nhiều đặc điểm tốt và xấu của GCM. Nhưng nonce-request là không cần thiết cho MAC, và ở đây nó mua rất ít lợi ích. Các cuộc tấn công thực tế nếu các thẻ bị cắt ngắn tới 64 bit và phạm vi giải mã không được theo dõi và hạn chế. Thất bại hoàn toàn về việc không sử dụng lại. Sử dụng là ẩn dù sao nếu GCM được thông qua. Không khuyến nghị cho tiêu chuẩn hóa riêng biệt.

mã hóa xác thực (cả mã hóa và toàn vẹn thông điệp)

CCM : Một lược đồ AEAD không dựa trên kết hợp mã hóa chế độ CTR và CBC-MAC thô. Hoàn toàn nối tiếp, giới hạn tốc độ trong một số bối cảnh. Có thể an toàn, với giới hạn tốt, giả sử mã hóa cơ bản là một PRP tốt. Xây dựng chắc chắn mà thực hiện công việc. Đơn giản hơn để thực hiện hơn GCM. Có thể được sử dụng như một MAC không dựa trên. Được chuẩn hóa và sử dụng rộng rãi.

GCM : Một lược đồ AEAD không dựa trên kết hợp mã hóa chế độ CTR và hàm băm phổ quát dựa trên cơ sở GF (2128). Đặc tính hiệu quả tốt cho một số môi trường thực hiện. Kết quả tốt có thể chứng minh an toàn giả sử cắt ngắn thẻ tối thiểu. Tấn công và giới hạn bảo mật có thể chứng minh kém trong sự hiện diện của việc cắt thẻ đáng kể. Có thể được sử dụng như một MAC không dựa trên, sau đó được gọi là GMAC. Lựa chọn đáng ngờ để cho phép các nonces ngoài 96 bit. Đề nghị hạn chế nonces đến 96 bit và thẻ tối thiểu 96 bit. Được chuẩn hóa và sử dụng rộng rãi.


1
Chế độ GCM: Do hầu hết trên SO có ít hoặc không có kiến ​​thức về mã hóa, sẽ không sử dụng bất kỳ chế độ nào một cách chính xác, thường không sử dụng xác thực và thường sử dụng chế độ ECB Chế độ GCM có lẽ là lựa chọn tốt nhất ở đây . Thật không may, việc thiếu triển khai nền tảng, trong một số trường hợp (iOS) không có nhà cung cấp hỗ trợ, việc kiểm tra kém trong nhiều trường hợp thiếu hỗ trợ phần cứng, hiện tại nó đang gặp vấn đề. Mặt khác, nó là tốt cho người không quen trong mã hóa vì nó có xác thực được xây dựng và dường như là tương lai.
zaph

3
Chế độ CTR: Tôi không đồng ý với chế độ CTR là lựa chọn tốt nhất vì có quá nhiều thất bại trong thực tế, chủ yếu là tái sử dụng IV. Ngay cả Microsoft cũng đã làm hỏng việc này ít nhất một vài lần.
zaph

1
Chế độ CBC: Có lẽ là chế độ phổ biến nhất và chế độ được sử dụng nhiều nhất trên SO, ECB (không nên sử dụng) ngoại trừ. Các lỗi sử dụng chính là IV không ngẫu nhiên nhưng chúng ta đang thấy các cách sử dụng đúng hơn với CSPRNG. Padding Orials, trong khi một vấn đề, dễ dàng được khắc phục bằng cách đơn giản bỏ qua và không trả lại lỗi đệm. Một số triển khai (ví dụ: Tiền điện tử thông thường) không báo cáo lỗi đệm theo cách cơ bản thành công để tránh chúng ở cấp API.
zaph

1
IMO TLB tệ hơn vì nó là một xor đơn giản trong đó CBC có sự lan truyền từ khối này sang khối khác như một số chế độ khác. Nó có vẻ dễ dàng nhưng đã có những thất bại lớn trong mã thị trường đại chúng.
zaph

1
Từ việc đọc giấy được liên kết, dường như chỉ có khóa xác thực, không phải khóa mã hóa từ việc sử dụng lại. Điều đó dường như không phải là tuyên bố trong các ý kiến ​​ở đây rằng khóa mã hóa được lấy. Trong khi có được khóa xác thực cho phép giả mạo tin nhắn, nó không cho phép khôi phục tin nhắn. Hãy chỉ ra nơi tôi có thể sai.
zaph

30
  1. Bất cứ điều gì trừ ECB.
  2. Nếu sử dụng TLB, bắt buộc bạn phải sử dụng IV khác nhau cho mỗi tin nhắn, nếu không, bạn sẽ bị kẻ tấn công có thể lấy hai bản mã và lấy một bản rõ không được mã hóa kết hợp. Lý do là chế độ CTR về cơ bản biến một mật mã khối thành mật mã luồng và quy tắc đầu tiên của mật mã luồng là không bao giờ sử dụng cùng một Khóa + IV hai lần.
  3. Thực sự không có nhiều khác biệt trong việc thực hiện các chế độ khó như thế nào. Một số chế độ chỉ yêu cầu mật mã khối hoạt động theo hướng mã hóa. Tuy nhiên, hầu hết các mật mã khối, bao gồm AES, không mất nhiều mã hơn để thực hiện giải mã.
  4. Đối với tất cả các chế độ mật mã, điều quan trọng là sử dụng các IV khác nhau cho mỗi tin nhắn nếu tin nhắn của bạn có thể giống hệt nhau trong một vài byte đầu tiên và bạn không muốn kẻ tấn công biết điều này.

Để hỗ trợ Điểm 1 của bạn (+1 cho btw đó): mã hóa kinh dị.com / blog / archives / 001267.html
Michael Stum

1
Bạn không nên bắt đầu TLB với một số ngẫu nhiên, vì điều đó có cơ hội va chạm nhỏ nhưng ngày càng tăng với một phần của tin nhắn trước đó. Thay vào đó, đơn điệu tăng nó (điều này có thể có nghĩa là ghi nhớ nơi bạn đang lưu trữ liên tục) và nhập lại khóa nếu (khi) bạn hết quầy.
phê

@Theran - điểm 2 - một số ngẫu nhiên khác nhau cho mỗi tin nhắn? Không, tôi nghĩ rằng điều đó là không chính xác. Tôi có ấn tượng rằng bắt đầu quầy luôn ở mức 0 là tốt. @caf, tôi nghĩ khi Theran nói "tin nhắn" thì anh ta không có nghĩa là "chặn". Tất nhiên, bộ đếm được tăng lên cho mỗi khối của một thông điệp cụ thể chạy qua mật mã. Điều mà Theran dường như đang nói là mỗi tin nhắn phải bắt đầu bằng một giá trị ban đầu khác nhau cho bộ đếm. Và tôi nghĩ điều này không đúng.
Cheeso

1
re: điểm 3 - Tôi đã đọc các bài báo nói, ví dụ, chế độ CTR nhỏ hơn để thực hiện vì giải mã là biến đổi tương tự như mã hóa. Do đó một nửa mã. Nhưng như tôi nói, không liên quan trên máy cấp độ máy chủ.
Cheeso

Vâng, tôi sai chính tả. Đó là IV / nonce nên thay đổi cho chế độ CTR, nhưng được kết hợp với bộ đếm trước khi mã hóa, vì vậy tôi có xu hướng chỉ nghĩ nó là điểm khởi đầu ngẫu nhiên cho bộ đếm. Theo như chỉ phải sử dụng mật mã trong không gian tiết kiệm hướng mã hóa, đối với nhiều mật mã, bạn chỉ phải đảo ngược các khóa con để giải mã. AES hơi cồng kềnh để giải mã, nhưng không giống như bạn có thể thực hiện nó trên một uC với 128 byte RAM. Các khóa con mất nhiều RAM hơn thế!
Theran

13

Bạn đã bắt đầu bằng cách đọc thông tin về điều này trên Wikipedia - Chặn các chế độ hoạt động mật mã ? Sau đó theo liên kết tham chiếu trên Wikipedia đến NIST: Khuyến nghị cho các chế độ hoạt động mã hóa khối .


6
Câu trả lời này không đáp ứng các tiêu chuẩn chất lượng của Stackoverflow: xin vui lòng, trong câu trả lời của bạn, rằng tất cả các liên kết bên ngoài sẽ bị chết và tóm tắt - nếu không sao chép hoàn toàn - thông tin liên quan, lý tưởng nhất là cách được thiết kế để trả lời câu hỏi ban đầu tốt nhất.
mirabilos

5
@mirabilos Đến gần 5 năm sau, đề cập đến các tiêu chuẩn và tiêu chuẩn không tồn tại vào thời điểm đó, thực sự? Tôi đặc biệt thích nói về các liên kết chết khi cả hai ở đây thực sự vẫn còn rất nhiều, và đưa ra các trang web trong câu hỏi có khả năng vẫn còn như vậy trong 5 năm nữa. Ồ tốt
KTC

3
@mirabilos Bạn có thể đi đúng cho là , nhưng khiếu nại của bạn chống lại một câu trả lời mà dường như đã được thực hiện 5 năm trước đây, nơi chuẩn mực là khác nhau không áp dụng. Bạn nên thừa nhận sai lầm của bạn. Ngay cả khi đó không phải là trường hợp và thay vào đó bạn ngụ ý rằng nó nên được cập nhật hoặc thay đổi, thì nó vẫn không bắt buộc. Câu trả lời chính xác từ cách nó được.
konsolebox

@KTC Ngoại trừ khi chính phủ đóng cửa và trang web đang ngoại tuyến. Câu trả lời của bạn có thể là thông tin hữu ích, nhưng hiện tại, hoàn toàn bị thiếu. Vì vậy, người đọc câu hỏi này và câu trả lời của nó vẫn còn băn khoăn cả những gì đã được cập nhật trong năm 2014 (do câu trả lời chưa đầy đủ) và tình trạng hiện tại (do chính phủ đóng cửa trang web của NIST). Tuy nhiên, tôi muốn thêm thông tin còn thiếu ...
G DeMasters

11

Bạn có thể muốn chọn dựa trên những gì có sẵn rộng rãi. Tôi đã có cùng một câu hỏi và đây là kết quả nghiên cứu hạn chế của tôi.

Hạn chế phần cứng

STM32L (low energy ARM cores) from ST Micro support ECB, CBC,CTR GCM
CC2541 (Bluetooth Low Energy) from TI supports ECB, CBC, CFB, OFB, CTR, and CBC-MAC

Hạn chế nguồn mở

Original rijndael-api source  - ECB, CBC, CFB1
OpenSSL - command line CBC, CFB, CFB1, CFB8, ECB, OFB
OpenSSL - C/C++ API    CBC, CFB, CFB1, CFB8, ECB, OFB and CTR
EFAES lib [1] - ECB, CBC, PCBC, OFB, CFB, CRT ([sic] CTR mispelled)  
OpenAES [2] - ECB, CBC 

[1] http://www.codeproject.com/Articles/57478/A-Fast-and- Easy-to-Us-AES-L Library

[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip


1
ST Micro: EBC phải là ECB; FYI: ví dụ STM32L4A6 hỗ trợ AES 128 bit và 256 bit, với ECB, CBC, CTR, GCM, cũng như mã xác thực tin nhắn Galois (GMAC) hoặc thuật toán mã xác thực mã hóa CMAC cũng được hỗ trợ bởi phần cứng.
Tom Kuschel

-3

Tôi biết một khía cạnh: Mặc dù CBC cung cấp bảo mật tốt hơn bằng cách thay đổi IV cho từng khối, nhưng nó không áp dụng cho nội dung được mã hóa được truy cập ngẫu nhiên (như đĩa cứng được mã hóa).

Vì vậy, sử dụng CBC (và các chế độ tuần tự khác) cho các luồng tuần tự và ECB để truy cập ngẫu nhiên.


À, đúng rồi, tất nhiên rồi. CBC XORs khối mã hóa trước với khối bản rõ trước khi mã hóa. Khối đầu tiên sử dụng IV. Vì vậy, để giải mã bất kỳ khối nào, bạn phải giải mã thành công tất cả các khối trước đó. ok, đó là một cái nhìn sâu sắc tốt.
Cheeso

6
Không, bạn chỉ phải có quyền truy cập vào bản mã trước , không yêu cầu giải mã bất kỳ khối nào trước đó.
phê

À, điều đó có nghĩa là CBC vẫn ổn với truy cập ngẫu nhiên, phải không?
Cheeso

4
@Cheeso: CBC tốt cho truy cập đọc ngẫu nhiên, nhưng không cho truy cập ghi ngẫu nhiên. Sử dụng TLB ở đó.
Paŭlo Ebermann

3
@ PaŭloEbermann Đối với TLB truy cập ngẫu nhiên không phải là một ý tưởng hay, vì nó cho phép các cuộc tấn công nghiêm trọng nếu kẻ tấn công quan sát hai phiên bản của bản mã. Sử dụng XTS hoặc một mã hóa khối có thể điều chỉnh thay thế.
CodeInChaos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.