it-swarm-vi.com

Tại sao AES không được sử dụng để băm an toàn, thay vì SHA-x?

Theo tôi hiểu, AES được cho là cực kỳ an toàn. (Tôi đã đọc ở đâu đó rằng nó chắc chắn sẽ không bị phá vỡ trong 20 năm tới, nhưng tôi vẫn không chắc liệu tác giả có nghiêm túc không.)

DES vẫn không quá tệ đối với một cypher cũ và 3DES vẫn được sử dụng (có thể không quá nhiều, nhưng ít nhất tôi thấy 3DES trong about: config trong Firefox).

Có vẻ như các cyphers khối (tốt) được cộng đồng tiền điện tử tin tưởng.

OTOH, nhiều vấn đề với các hàm băm mật mã được phát hiện.

Theo quan điểm của người không chuyên về tiền điện tử: các hàm băm và các cyphers đối xứng là một thứ thực sự giống nhau: một hàm "ngẫu nhiên" (với các đầu vào và đầu ra khác nhau).

Vì vậy, tại sao không sử dụng chỉ AES để băm? Đây có vẻ là những điều rõ ràng phải làm để có được sự an toàn mạnh mẽ của AES cho việc băm. Là một phần thưởng, việc triển khai phần cứng của AES có giúp được gì không?

Có một lời giải thích đơn giản về sự khác biệt thực sự giữa các hàm băm và các cyphers đối xứng?

46
curiousguy

Một mật mã khối có một khóa; tính bảo mật của khóa là những gì bảo mật mật mã được xây dựng. Mặt khác, một hàm băm hoàn toàn không có khóa và không có "dữ liệu bí mật" nào được xây dựng để bảo mật cho hàm băm.

Một mật mã khối là đảo ngược: nếu bạn biết khóa, bạn có thể giải mã những gì đã được mã hóa. Về mặt kỹ thuật, đối với một khóa đã cho, mật mã khối là a hoán vị không gian của các giá trị khối có thể. Các hàm băm có nghĩa là không thể đảo ngược và chúng không phải là hoán vị theo bất kỳ cách nào.

Một mật mã khối hoạt động trên các khối có kích thước cố định (khối 128 bit cho AES), cho cả đầu vào và đầu ra. Hàm băm có đầu ra có kích thước cố định, nhưng phải chấp nhận đầu vào lớn tùy ý.

Vì vậy, mật mã khối và hàm băm là những động vật thực sự khác nhau; thay vì cố gắng phân biệt chúng, sẽ dễ dàng nhận thấy điểm chung của chúng: cụ thể là những người biết cách thiết kế mật mã khối cũng khá giỏi trong việc thiết kế các hàm băm, bởi vì các công cụ toán học phân tích tương tự nhau rất nhiều đại số tuyến tính và hàm boolean, thực sự).

Chúng ta hãy đi cho các định nghĩa chính thức hơn:

Mật mã khối là một họ hoán vị được chọn bởi một khóa. Chúng tôi xem xét không gian [~ # ~] b [~ # ~] of n - khối bit cho một số giá trị cố định của n; kích thước của [~ # ~] b [~ # ~] 2n. Khóa là các giá trị từ một khoảng trắng [~ # ~] k [~ # ~], thường là một không gian khác của chuỗi m bits ( m không nhất thiết phải bằng n). Khóa k chọn hoán vị trong số 2n! hoán vị có thể có của [~ # ~] b [~ # ~].

Một mật mã khối được coi là an toàn miễn là nó không thể phân biệt được tính toán với một hoán vị đã được chọn thống nhất và ngẫu nhiên trong số 2n! hoán vị có thể. Để mô hình hóa điều đó, hãy tưởng tượng một tình huống mà kẻ tấn công được cấp quyền truy cập vào hai hộp đen, một người thực hiện mật mã khối với một khóa mà kẻ tấn công không biết, và người kia là một hoán vị thực sự ngẫu nhiên. Mục tiêu của kẻ tấn công là cho biết cái nào là cái nào. Anh ta có thể có mỗi hộp mã hóa hoặc giải mã bất kỳ dữ liệu nào anh ta muốn. Tấn công có thể là thử tất cả các phím có thể (có 2m các khóa như vậy) chỉ tìm thấy một khóa, mang lại cùng một giá trị so với một trong các hộp; cái này có chi phí trung bình 2m-1 yêu cầu của mật mã. A safe mật mã khối là một trong những cuộc tấn công chung này là cuộc tấn công tốt nhất có thể.

AES được xác định trên các khối 128 bit ( n = 128) và các khóa 128-, 192- và 256 bit.

Hàm băm là một hàm tính toán duy nhất, được xác định đầy đủ, lấy làm chuỗi bit đầu vào có độ dài tùy ý và xuất ra các giá trị có độ dài cố định r (ví dụ r = 256 bit cho SHA-256). Không có chìa khóa, không có họ chức năng, chỉ là một chức năng duy nhất mà bất cứ ai cũng có thể tính toán.

Hàm băm h được coi là an toàn nếu:

  • Không thể tính toán được các tiền đề: đã cho a r - giá trị bit x, không thể tìm thấy m sao cho h (m) = x.
  • Không thể tính toán được các tìm kiếm thứ hai: đưa ra m, không thể tìm thấy m ' khác với m , sao cho h (m) = h (m ').
  • Không thể tính toán được các xung đột: không thể tìm thấy m m ', khác biệt với nhau, sao cho h ( m) = h (m ').

Có các cuộc tấn công chung có thể tìm thấy tiền tố, tiền tố thứ hai hoặc va chạm, với chi phí tương ứng, 2r, 2r 2r/2. Vì vậy, bảo mật thực tế chỉ có thể đạt được nếu r đủ lớn để 2r/2 là một chi phí cực kỳ lớn. Trong thực tế, điều này có nghĩa là r = 128 (hàm băm 128 bit như MD5) là không đủ.

Theo một cách không chính thức, sẽ tốt nếu hàm băm "trông giống như" nó được chọn ngẫu nhiên và thống nhất trong số các hàm có thể chấp nhận cùng một đầu vào. Nhưng đây là một thuộc tính không xác định vì chúng ta đang nói về một hàm duy nhất (xác suất luôn luôn ngầm về mức trung bình và trải nghiệm lặp lại; bạn thực sự không thể có xác suất với một hàm duy nhất). Ngoài ra, là một chức năng ngẫu nhiên không hoàn toàn giống như khả năng chống lại sự va chạm và tiền giả; đây là cuộc tranh luận về Mô hình Oracle ngẫu nhiên .


Tuy nhiên, có thể xây dựng hàm băm từ mật mã khối. Đây là những gì Merkle-Damgård xây dựng. Điều này đòi hỏi phải sử dụng thông báo đầu vào là key của mật mã khối; vì vậy, mật mã khối hoàn toàn không được sử dụng. Với AES, điều này chứng tỏ sự thất vọng:

  • Nó dẫn đến một hàm băm với đầu ra 128 bit, quá nhỏ để bảo mật đối với công nghệ có sẵn trong năm 2011.
  • Tính bảo mật của hàm băm sau đó dựa vào sự vắng mặt của các cuộc tấn công khóa liên quan trên mật mã khối. Các cuộc tấn công khóa liên quan không thực sự có bất kỳ ý nghĩa thực tế nào đối với mật mã khối khi được sử dụng để mã hóa; do đó, AES không được thiết kế để chống lại các cuộc tấn công như vậy, và thực sự, AES has a một vài điểm yế về mặt đó - không phải lo lắng về mã hóa, nhưng là một vấn đề lớn lo lắng nếu AES được sử dụng trong công trình Merkle-Damgård.
  • Hiệu suất sẽ không tốt.

Hàm băm Whirlpool là một thiết kế được xây dựng trên một mật mã khối lấy cảm hứng từ AES - không phải là thực tế. Mật mã khối đó có lịch trình khóa được cải thiện (và nặng hơn), chống lại các cuộc tấn công khóa liên quan và làm cho nó có thể sử dụng làm cốt lõi của hàm băm. Ngoài ra, mật mã khối đó hoạt động trên các khối 512 bit, không phải khối 128 bit. Whirlpool được tin là an toàn. Whirlpool được biết là rất chậm, vì vậy không ai sử dụng nó.

Một số thiết kế hàm băm gần đây đã cố gắng sử dụng lại phần của AES - chính xác, để sử dụng thao tác nội bộ ánh xạ tốt trên AES-NI hướng dẫn mà bộ xử lý Intel và AMD gần đây có tính năng. Xem ví dụ ECHO SHAvite- ; cả hai chức năng này đều nhận được khá nhiều tiếp xúc như là một phần của cạnh tranh SHA- và được cho là "an toàn hợp lý". Có rất nhanh trên bộ xử lý Intel và AMD gần đây. Trên các kiến ​​trúc yếu hơn, hiệu năng của hàm băm có một số cơ hội thực sự quan trọng, các hàm này khá chậm.

Có các cấu trúc khác có thể tạo hàm băm ra khỏi mật mã khối, ví dụ: cái được sử dụng trong Skein ; nhưng họ cũng có xu hướng yêu cầu các khối lớn hơn so với những gì AES được định nghĩa.

Tóm tắt: không chỉ là mật mã khối và hàm băm khá khác nhau; nhưng ý tưởng xây dựng hàm băm ra khỏi AES hóa ra có giá trị đáng ngờ. Nó không phải là dễ dàng, và kích thước khối AES giới hạn là trở ngại chính.

70
Thomas Pornin

Câu trả lời cơ bản là chúng là các loại thuật toán khác nhau. AES là một thuật toán khóa đối xứng. Bạn không thể sử dụng nó trong vai trò tương tự như RSA (thuật toán khóa chung) hoặc SHA-256 (thuật toán băm). Chúng là các hệ thống khác nhau được thiết kế với các thuộc tính và điểm yếu rất khác nhau.

Tuy nhiên, tôi đã dừng lại và mặc dù nghiêm túc về ý tưởng này để giải thích nó bên cạnh việc chỉ nói: "Đây là cách này." Xét cho cùng, một hàm băm theo nghĩa phổ quát là một biểu diễn lặp lại của dữ liệu theo kích thước cố định hoặc giảm. AES có thể cung cấp thông qua chế độ CBC. Tuy nhiên, có nhiều thuộc tính cho hàm băm an toàn hơn là giảm đơn giản.

Một thuật toán băm an toàn là một hệ thống một chiều. AES mã hóa và giải mã theo cùng một cách (mật mã đối xứng) và bạn có thể tạo ánh xạ 1-1 cho mỗi khối những gì sẽ xảy ra với một khóa đã cho. Trừ khi dữ liệu bị xiềng xích và do đó mất mát, bạn chỉ có thể giải mã "băm" AES thành dữ liệu nguồn.

Một cách hợp lý không thể đảo ngược quá trình a SHA ngoài việc chỉ thử các dữ liệu đầu vào khác nhau. Vì lý do bạn không thể sử dụng SHA-x để mã hóa thứ gì đó, bạn không thể sử dụng AES để băm cái gì đó.

11
Jeff Ferland

Có một lời giải thích đơn giản về sự khác biệt thực sự giữa các hàm băm và các cyphers đối xứng?

  • Một mật mã có thể đảo ngược, hàm băm không
  • Độ dài của đầu ra của một mật mã phụ thuộc vào độ dài của đầu vào; một hàm băm tạo ra đầu ra có cùng độ dài bất kể đầu vào
  • Một thay đổi bit đơn lẻ ở bất cứ đâu trong hàm băm mật mã tạo ra sự thay đổi xếp tầng (kịch tính) trong đầu ra băm. Theo quy định, điều này không đúng với mật mã.
  • Mật mã yêu cầu khóa, hàm băm không

Thiết kế và mục đích của cả hai về cơ bản là khác nhau và chúng không thể thay thế cho nhau.

9
tylerl

Về cơ bản, bạn có thể biến bất kỳ mật mã khối nào thành hàm băm bằng cách sử dụng Merkle-Damgard-xây dựng và về cơ bản bạn có thể biến bất kỳ hàm băm nào thành mật mã khối bằng cách sử dụng mạng Feistel nếu bạn xác định hàm Feistel F theo cách sau.

F(half_block, round_key) = hash(concatenate(half_block, round_key))

Nhưng nó khá kém hiệu quả (mất nhiều thời gian để tính toán), vì F rất tốn kém để tính toán (đó là thuật toán lặp sử dụng e. G. 80 "vòng" trong trường hợp SHA-512) và đối với cấu trúc Feistel, bản thân F được lặp lại nhiều lần. Giả sử bạn có mạng Feistel 20 tầng với chức năng F tròn 80 vòng, bạn thực hiện 1600 "vòng" SHA-2 cho mỗi khối. Nó cũng dẫn đến kích thước khối khá lớn (gấp đôi kích thước đầu ra của hàm băm), e. g. Mật mã khối 1024 bit nếu bạn sử dụng SHA-512 làm hàm băm.

Nhưng thực tế mà nói, nó không "không an toàn". Đó chỉ là "mật mã khối" sẵn có (hoán vị giả ngẫu nhiên - không hoán vị như hoán vị bit/byte, nhưng hoán vị theo nghĩa ánh xạ phỏng đoán giữa "tất cả các khối đầu vào có thể" và "tất cả các khối đầu ra có thể") hiệu quả, được sử dụng rộng rãi hơn và do đó được phân tích kỹ lưỡng hơn cho các thuộc tính của hoán vị giả danh tốt. Nếu bạn có sức mạnh tính toán để lãng phí, hãy sử dụng SHA-512 trong mạng Feistel làm mật mã khối. Các cơ hội ít nhất sẽ không an toàn hơn AES (miễn là bạn thêm một lịch trình khóa tốt để lấy "các phím tròn"), tuy nhiên, sẽ mất rất nhiề chu kỳ CPU để xử lý một khối.

3
no.human.being

M. Abel là chính xác. Một ví dụ khác về AES được sử dụng làm hàm băm là AES-CBC hoặc AES-PCBC.

https://en.wikipedia.org/wiki/Block_codes_mode_of_operation#Propagating_Codes_Block_Chained_.28PCBC.29

Nếu CBC hoặc PCBC hoặc thậm chí CFB được chạy trên một "tệp" có và không có lỗi, khối cuối cùng sẽ khác.

Đó là không hiệu quả, nhưng có thể được thực hiện. Logic là: "Nếu tất cả những gì bạn có là một cái búa, mọi thứ trông giống như một cái đinh". Điều tương tự cũng đúng với AES. Có thể có nhiều cách tốt hơn để băm, nhưng nếu tất cả những gì bạn có là AES. . .

0
aesuser