Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (497.81 KB, 36 trang )
<span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">
<b><small>12.3 Yêu cầu đối với mã xác thực thông điệp...2</small></b>
<b><small>12.4. Bảo mật của MAC...4</small></b>
<b><small>12.5 MAC dựa trên hàm băm: HMAC...6</small></b>
<b><small>12.6 MAC dựa trên mã khối: DAA và CMAC...11</small></b>
<b><small>12.7 Mật mã xác thực (AE)...15</small></b>
<b><small>12.8 Gói khóa...22</small></b>
<b><small>12.9 Sinh số giả ngẫu nhiên sử dụng hàm băm và MAC...28</small></b>
<b><small>12.10 Các thuật ngữ chính, câu hỏi ơn tập và bài tập...31</small></b>
<b>12.3 Yêu cầu đối với mã xác thực thông điệp</b>
Một MAC, hay còn được gọi là tổng kiểm tra mật mã, được tạo ra bởi một hàm C có dạng
T = MAC(K, M)
trong đó M là một thơng điệp có độ dài biến thiên, K là khóa bí mật chỉ được người gửi và người nhận chia sẻ, và MAC(K, M) là trình xác thực có độ dài cố định, đôi khi được gọi là thẻ. Thẻ được gắn vào thông điệp tại nguồn vào lúc thông điệp được giả định hoặc được biết là chính xác. Người nhận xác thực thơng điệp đó bằng cách tính tốn lại thẻ.
Khi tồn bộ thơng điệp được mã hóa để đảm bảo tính bảo mật, sử dụng mã hóa đối xứng hoặc khơng đối xứng, thì bảo mật của lược đồ thường phụ thuộc vào độ dài bit của khóa. Nếu khơng có điểm yếu nào trong thuật tốn, kẻ tấn cơng phải sử dụng phương thức tấn công brute-force bằng tất cả các khóa có thể. Trung bình, một cuộc tấn công như vậy sẽ yêu cầu <small>2</small><i><small>k−1</small></i> nỗ lực cho một khóa k-bit. Cụ thể, đối với một cuộc tấn công chỉ ciphertext, kẻ tấn công, được cung cấp ciphertext C, thực hiện <i><small>P</small><sub>i</sub></i> = D(Ki, C) cho tất cả các giá trị khóa có thể Ki cho đến khi tạo ra một
<i><small>P</small><sub>i</sub></i> phù hợp với dạng của plaintext chấp nhận được.
Trong trường hợp của MAC, các cân nhắc hoàn tồn khác nhau. Nói chung, hàm MAC là một hàm nhiều-đến-một, do bản chất nhiều-đến-một của hàm. Sử dụng phương pháp brute-force, kẻ tấn công sẽ cố gắng khám phá khóa như thế nào? Nếu tính bảo mật khơng được sử dụng, kẻ tấn cơng có thể truy cập vào các thông điệp plaintext và MAC tương ứng của chúng. Giả sử k > n; nghĩa là, giả sử kích thước khóa lớn hơn kích thước MAC. Sau đó, với một <i><small>M</small></i><sub>1</sub> và <i><small>T</small></i><sub>1</sub> đã biết, với <i><small>T</small></i><sub>1</sub>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">= MAC(K, <i><small>M</small></i><sub>1</sub>), nhà phân tích mật mã có thể thực hiện <i><small>T</small><sub>i</sub></i> = MAC(<i><small>K</small><sub>i</sub></i>, <i><small>M</small></i><sub>1</sub>) cho tất cả các giá trị khóa có thể ki. Ít nhất một khóa sẽ được đảm bảo để tạo ra một sự trùng khớp của <i><small>K</small></i><sub>1</sub> = <i><small>M</small></i><sub>1</sub>. Lưu ý rằng tổng cộng <small>2</small><i><small>k</small></i> thẻ sẽ được tạo ra, nhưng chỉ có <small>2</small><i><small>n</small></i>< <small>2</small><i><small>k</small></i>
giá trị thẻ khác nhau. Do đó, một số khóa sẽ tạo ra thẻ chính xác và kẻ tấn cơng khơng có cách nào biết khóa nào là chính xác. Trung bình, tổng cộng <small>2</small><i><small>k</small></i>/<small>2</small><i><small>n</small></i> = <small>2</small><i><small>(k−n)</small></i>
khóa sẽ tạo ra một sự trùng khớp. Do đó, kẻ tấn cơng phải lặp đi lặp lại cuộc tấn cơng.
+ Vịng 1
Được cung cấp: <i><small>M</small></i><sub>1</sub>, <i><small>T</small></i><sub>1</sub> = MAC(K, <i><small>M</small></i><sub>1</sub>)
Tính tốn <i><small>T</small><sub>i</sub></i> = MAC(<i><small>K</small><sub>i</sub></i> , <i><small>M</small></i><sub>1</sub>) cho tất cả <small>2</small><i><small>k</small></i> khóa Số lượng trùng khớp ≈ <small>2</small><i><small>k−n</small></i>
+ Vòng 2
Được cung cấp: <i><small>M</small></i><sub>2</sub>, <i><small>T</small></i><sub>2</sub> = MAC(K, <i><small>M</small></i><sub>2</sub>)
Tính tốn <i><small>T</small><sub>i</sub></i>= MAC(<i><small>K</small><sub>i</sub></i> , <i><small>M</small></i><sub>2</sub>) cho <small>2</small><i><small>k−n</small></i>khóa kết quả từ Vòng 1 Số lượng trùng khớp ≈ <small>2</small><i><small>(k−2∗n)</small></i>
Cứ như vậy. Trung bình, a vịng sẽ cần thiết k = a * n. Ví dụ, nếu sử dụng khóa 80 bit và thẻ là 32 bit, thì vịng đầu tiên sẽ tạo ra khoảng <small>248</small> khóa có thể. Vịng thứ hai sẽ thu hẹp các khóa có thể xuống khoảng <small>216</small> khả năng. Vòng thứ ba sẽ chỉ tạo ra một khóa duy nhất, đó phải là khóa được người gửi sử dụng.
Nếu độ dài khóa nhỏ hơn hoặc bằng độ dài thẻ, thì có khả năng vòng đầu tiên sẽ tạo ra một sự trùng khớp duy nhất. Có thể có nhiều hơn một khóa tạo ra sự trùng khớp như vậy, trong trường hợp đó, kẻ tấn công sẽ cần thực hiện cùng một bài kiểm tra trên một cặp (thơng điệp, thẻ) mới.
Do đó, một nỗ lực brute-force để khám phá khóa xác thực tốn khơng ít sức lực hơn và có thể tốn kém hơn so với nỗ lực cần thiết để khám phá khóa giải mã có cùng độ dài. Tuy nhiên, các cuộc tấn công khác không yêu cầu khám phá khóa là có thể.
Hãy xem xét thuật tốn MAC sau. Gọi M = (<i><small>X</small></i><sub>1</sub>|| <i><small>X</small></i><sub>2</sub>|| …|| <i><small>X</small><sub>m</sub></i>) là một thông điệp được xử lý như một chuỗi các khối 64 bit <i><small>X</small><sub>i</sub></i>. Sau đó định nghĩa
∆(M) = <i><small>X</small></i><sub>1</sub> ⊕ <i><small>X</small></i><sub>2</sub> ⊕ …⊕ <i><small>X</small><sub>m</sub></i>
MAC(K, M) = E(K, ∆(M))
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">trong đó ⊕ là một phép tốn logic nhị phân trên hai bit (XOR) và thuật toán mã hóa là DES ở chế độ mã sách điện tử. Do đó, độ dài khóa là 56 bit và độ dài thẻ là 64 bit. Nếu kẻ tấn công quan sát {M||MAC(K, M)}, một nỗ lực brute-force để xác định K sẽ u cầu ít nhất <small>256</small>mã hóa. Nhưng kẻ tấn cơng có thể tấn cơng hệ thống bằng cách thay thế <i><small>X</small></i><sub>1</sub> đến <i><small>X</small><sub>m−1</sub></i>bằng bất kỳ giá trị mong muốn nào <i><small>Y</small></i><sub>1</sub> đến <i><small>Y</small><sub>m−1</sub></i>và thay thế Xm bằng Ym, trong đó Ym được tính như
<i><small>Y</small><sub>m</sub></i> = <i><small>Y</small></i><sub>1</sub> ⊕ <i><small>Y</small></i><sub>2</sub> ⊕ ... ⊕ <i><small>Y</small><sub>m−1</sub></i> ⊕ ∆(M)
Bây giờ kẻ tấn cơng có thể nối thơng điệp mới, bao gồm Y1 đến Ym, sử dụng thẻ gốc để tạo thành một thông điệp sẽ được chấp nhận là xác thực bởi người nhận. Với chiến thuật này, bất kỳ thơng điệp nào có độ dài 64 * (m - 1) bit đều có thể được chèn gian lận.
Do đó, trong việc đánh giá tính bảo mật của hàm MAC, chúng ta cần xem xét các loại tấn cơng có thể được thực hiện chống lại nó. Với ý nghĩ đó, chúng ta hãy nêu các yêu cầu cho hàm. Giả sử kẻ tấn công biết hàm MAC nhưng không biết K. Sau đó hàm MAC nên đáp ứng các yêu cầu sau:
1. Nếu kẻ tấn công quan sát M và MAC(K, M), thì kẻ tấn cơng khơng thể tạo ra một thông điệp M' sao cho
MAC(K, M') = MAC(K, M)
2. MAC(K, M) nên được phân phối đồng đều theo nghĩa là đối với các thông điệp được chọn ngẫu nhiên, M và M', xác suất rằng MAC(K, M) = MAC(K, M') là <small>2</small><i><small>−n</small></i>, trong đó n là số bit trong thẻ.
3. Cho M' bằng một số biến đổi đã biết trên M. Nghĩa là, M' = f(M). Ví dụ, f có thể liên quan đến việc đảo ngược một hoặc nhiều bit cụ thể. Trong trường hợp đó,
Pr [MAC(K, M) = MAC(K, M')] = <small>2</small><i><small>−n</small></i>
Yêu cầu đầu tiên đề cập đến ví dụ trước, trong đó kẻ tấn cơng có thể tạo ra một thơng điệp mới để khớp với thẻ đã cho, ngay cả khi kẻ tấn công khơng biết và khơng học được khóa. u cầu thứ hai giải quyết nhu cầu ngăn chặn một cuộc tấn công brute-force dựa trên plaintext được chọn. Nghĩa là, nếu chúng ta giả sử kẻ tấn công không biết K nhưng có quyền truy cập vào hàm MAC và có thể trình bày các thơng điệp để tạo MAC, thì kẻ tấn cơng có thể thử các thơng điệp khác nhau cho đến khi tìm thấy một thơng
điệp khớp với thẻ đã cho. Nếu hàm MAC thể hiện phân phối đồng đều, thì phương pháp brute-force sẽ yêu cầu, trung bình, <small>2</small><i><small>n−1</small></i>nỗ lực trước khi tìm thấy một thơng điệp phù hợp với thẻ đã cho.
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">Yêu cầu cuối cùng quy định rằng thuật toán xác thực không nên yếu hơn đối với các phần hoặc bit nhất định của thông điệp so với các phần khác. Nếu khơng phải là trường hợp này, thì kẻ tấn cơng có thơng điệp M và MAC(K, M) có thể thử các biến thể trên M tại các điểm yếu đã biết với xác suất thành công sớm khi tạo ra một thông điệp mới khớp với thẻ cũ.
<b>12.4. Bảo mật của MAC</b>
Cũng giống như với các thuật toán mã hóa và hàm băm, chúng ta có thể chia các cuộc tấn công vào MAC thành hai loại: tấn công brute-force và tấn công giải mã mật mã.
<b>Tấn công brute-force</b>
Một cuộc tấn cơng force vào MAC khó khăn hơn một cuộc tấn cơng brute-force vào hàm băm vì nó yêu cầu các cặp thông điệp-thẻ đã biết. Chúng ta hãy xem lý do tại sao. Để tấn công mã băm, chúng ta có thể tiến hành theo cách sau. Với một thơng điệp cố định x có mã băm n bit h = H(x), một phương pháp brute-force để tìm thấy một sự va chạm là chọn một chuỗi bit ngẫu nhiên y và kiểm tra xem H(y) = H(x) hay khơng. Kẻ tấn cơng có thể thực hiện điều này lặp đi lặp lại ngoại tuyến. Việc liệu một cuộc tấn cơng ngoại tuyến có thể được sử dụng trên một thuật tốn MAC hay khơng phụ thuộc vào kích thước tương đối của khóa và thẻ.
Để tiếp tục, chúng ta cần nêu rõ đặc tính bảo mật mong muốn của một thuật tốn MAC, có thể được thể hiện như sau.
+ Khả năng chống lại các tính toán: Với một hoặc nhiều cặp văn bản-MAC [
<i><small>x</small><sub>i</sub></i>,MAC(K, <i><small>x</small><sub>i</sub></i>)], việc tính tốn bất kỳ cặp văn bản-MAC [x, MAC(K, x)] nào cho bất kỳ đầu vào mới x ≠ <i><small>x</small><sub>i</sub></i> nào đều khơng khả thi về mặt tính tốn.
Nói cách khác, kẻ tấn cơng muốn tìm ra mã MAC hợp lệ cho một thơng điệp x nhất định. Có hai cách tấn cơng có thể: tấn cơng vào khơng gian khóa và tấn cơng vào giá trị MAC. Chúng ta hãy xem xét từng cái một.
<b>Tấn công không gian khóa</b>
Nếu kẻ tấn cơng có thể xác định được khóa MAC, thì có thể tạo ra giá trị MAC hợp lệ cho bất kỳ đầu vào x nào. Giả sử kích thước khóa là k bit và kẻ tấn cơng có một cặp văn bản-thẻ đã biết. Sau đó, kẻ tấn cơng có thể tính tốn thẻ n bit trên văn bản đã biết cho tất cả các khóa có thể. Ít nhất một khóa được đảm bảo để tạo ra thẻ chính xác, đó là khóa hợp lệ đã được sử dụng để tạo cặp văn bản-thẻ đã biết. Giai đoạn tấn công này mất một lượng công sức tỷ lệ với <small>2</small><i><small>k</small></i> (nghĩa là, một thao tác cho mỗi giá trị khóa có thể <small>2</small><i><small>k</small></i>). Tuy nhiên, như đã mơ tả trước đó, vì MAC là một ánh
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">xạ nhiều-đến-một, nên có thể có các khóa khác tạo ra giá trị chính xác. Do đó, nếu tìm thấy nhiều hơn một khóa tạo ra giá trị chính xác, thì phải kiểm tra thêm các cặp văn bản-thẻ. Có thể chỉ ra rằng lượng cơng sức giảm nhanh chóng với mỗi cặp văn bản-MAC bổ sung và tổng lượng công sức xấp xỉ bằng <small>2</small><i><small>k</small></i> [MENE97].
<b>Tấn cơng giá trị thẻ</b>
Kẻ tấn cơng cũng có thể tấn cơng thẻ mà khơng cố gắng phục hồi khóa. Tại đây, mục tiêu là tạo ra một thẻ hợp lệ cho một thơng điệp nhất định hoặc tìm một thơng điệp khớp với một thẻ nhất định. Trong cả hai trường hợp, lượng công sức tương đương với lượng công sức để tấn cơng đặc tính chống va chạm một chiều hoặc yếu của mã băm, hoặc <small>2</small><i><small>n</small></i>. Trong trường hợp của MAC, cuộc tấn công không thể được thực hiện ngoại tuyến mà khơng có thêm đầu vào; kẻ tấn công sẽ yêu cầu các cặp văn bản-thẻ đã chọn hoặc biết khóa.
Tóm lại, lượng cơng sức cho một cuộc tấn cơng brute-force vào một thuật tốn MAC có thể được biểu thị dưới dạng min(<small>2</small><i><small>k</small>, </i><small>2</small><i><small>n</small></i>). Đánh giá sức mạnh tương tự như đối với các thuật toán mã hóa đối xứng. Có vẻ hợp lý khi yêu cầu độ dài khóa và độ dài thẻ phải thỏa mãn mối quan hệ như min(k, n) <i><small>≥</small></i> N, trong đó N có thể trong khoảng 128 bit.
<b>Giải mã mật mã</b>
Cũng giống như với các thuật tốn mã hóa và hàm băm, các cuộc tấn công giải mã mật mã vào các thuật tốn MAC tìm cách khai thác một số đặc tính của thuật tốn để thực hiện một số cuộc tấn cơng khác ngồi việc tìm kiếm cạn kiệt. Cách đo lường khả năng chống lại giải mã mật mã của một thuật toán MAC là so sánh sức mạnh của nó với lượng cơng sức cần thiết cho một cuộc tấn công brute-force. Nghĩa là, một thuật toán MAC lý tưởng sẽ yêu cầu một nỗ lực giải mã mật mã lớn hơn hoặc bằng nỗ lực brute-force.
Có nhiều sự đa dạng hơn trong cấu trúc của MAC so với hàm băm, vì vậy rất khó để khái quát về giải mã mật mã của MAC. Hơn nữa, đã có rất ít cơng việc được thực hiện để phát triển các cuộc tấn công như vậy. Một khảo sát hữu ích về một số phương pháp cho các MAC cụ thể là [PREN96].
<b>12.5 MAC dựa trên hàm băm: HMAC</b>
Ở phần sau của chương này, chúng ta xem xét các ví dụ về MAC dựa trên việc sử dụng cơ chế đối xứng khóa mật mã. Đây truyền thống là cách tiếp cận phổ biến nhất để xây dựng MAC. Trong những năm gần đây, đã có sự quan tâm ngày
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">càng tăng đối với việc phát triển MAC được bắt nguồn từ hàm băm mật mã. Động cơ thúc đẩy sự quan tâm này là:
1. Các hàm băm mật mã như MD5 và SHA thường thực thi nhanh hơn trong phần mềm so với các mã hóa khối đối xứng như DES.
2. Mã thư viện cho các hàm băm mật mã có sẵn rộng rãi.
Với sự phát triển của AES và tính sẵn có rộng rãi hơn của mã cho các thuật toán mã hóa, những cân nhắc này ít quan trọng hơn, nhưng MAC dựa trên băm vẫn tiếp tục được sử dụng rộng rãi.
Một hàm băm như SHA không được thiết kế để sử dụng làm MAC và không thể được sử dụng trực tiếp cho mục đích đó, vì nó khơng dựa trên khóa bí mật. Đã có một số đề xuất về việc kết hợp khóa bí mật vào thuật tốn băm hiện có. Phương pháp nhận được nhiều sự ủng hộ nhất là HMAC [BELL96a, BELL96b]. HMAC đã được ban hành dưới dạng RFC 2104, đã được chọn làm MAC bắt buộc phải triển khai cho bảo mật IP và được sử dụng trong các giao thức Internet khác, chẳng hạn như SSL. HMAC cũng đã được ban hành dưới dạng tiêu chuẩn NIST (FIPS 198).
<b>Các Mục tiêu Thiết kế HMAC</b>
RFC 2104 liệt kê các mục tiêu thiết kế sau cho HMAC:
Sử dụng các hàm băm có sẵn mà không cần sửa đổi. Đặc biệt, sử dụng các hàm băm hoạt động tốt trong phần mềm và có mã có sẵn và miễn phí.
Cho phép dễ dàng thay thế hàm băm được nhúng trong trường hợp tìm thấy hoặc yêu cầu các hàm băm nhanh hơn hoặc an toàn hơn.
Giữ nguyên hiệu suất ban đầu của hàm băm mà không gây suy giảm đáng kể.
Sử dụng và xử lý khóa một cách đơn giản.
Có phân tích mật mã được hiểu rõ về sức mạnh của cơ chế xác thực dựa trên các giả định hợp lý về hàm băm được nhúng.
Hai mục tiêu đầu tiên rất quan trọng đối với việc chấp nhận HMAC. HMAC coi hàm băm là một “hộp đen”. Điều này có hai lợi ích. Đầu tiên, có thể sử dụng một triển khai hàm băm hiện có làm mơ-đun trong việc triển khai HMAC. Bằng cách này, phần lớn mã HMAC được đóng gói sẵn và sẵn sàng sử dụng mà không cần sửa đổi. Thứ hai, nếu cần thay thế một hàm băm nhất định trong triển khai HMAC, tất cả những gì cần làm là gỡ bỏ mơ-đun hàm băm hiện tại và thả vào mô-đun mới. Điều này có thể được thực hiện nếu cần hàm băm nhanh hơn. Quan trọng hơn, nếu bảo mật của hàm băm được nhúng bị xâm phạm, bảo mật của HMAC vẫn có thể
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">được duy trì bằng cách chỉ cần thay thế hàm băm được nhúng bằng hàm băm an tồn hơn (ví dụ: thay thế SHA-2 bằng SHA-3).
Mục tiêu thiết kế cuối cùng trong danh sách trước đó thực sự là ưu điểm chính của HMAC so với các lược đồ dựa trên băm khác được đề xuất. HMAC có thể được chứng minh là an tồn nếu hàm băm được nhúng có một số điểm mạnh mật mã hợp lý. Chúng tôi sẽ quay lại điểm này sau trong phần này, nhưng trước tiên chúng tơi hãy xem xét cấu trúc của HMAC.
<b>Thuật tốn HMAC</b>
Hình 12.5 minh họa hoạt động tổng thể của HMAC. Xác định các thuật ngữ sau:
H = hàm băm nhúng (ví dụ: MD5, SHA-1, RIPEMD-160) IV = giá trị ban đầu được nhập vào hàm băm
M = thông điệp được nhập vào HMAC (bao gồm cả padding được chỉ định trong hàm băm được nhúng)
<i><small>Y</small><sub>i</sub></i> = khối thứ i của M, 0 <i><small>≤</small></i> i <i><small>≤</small></i> (L - 1) L = số khối trong M
b = số bit trong một khối
n = độ dài của mã băm được tạo ra bởi hàm băm được nhúng
K = khóa bí mật; độ dài được khuyến nghị là >= n; nếu độ dài khóa lớn hơn b, khóa sẽ được nhập vào hàm băm để tạo ra khóa n bit
<i><small>K</small></i><small>+¿ ¿</small>= K được đệm bằng các số khơng ở bên trái để kết quả có độ dài b bit
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">Hình 12.5 Cấu trúc HMAC
ipad = 00110110 (36 ở hệ thập lục phân) được lặp lại b/8 lần opad = 01011100 (5C ở hệ thập lục phân) được lặp lại b/8 lần Sau đó, HMAC có thể được biểu diễn như sau:
HMAC(K, M) = H[(<i><small>K</small></i><small>+¿ ¿</small>⊕ opad) || H[(<i><small>K</small></i><small>+¿ ¿</small>⊕ ipad) || M]] trong đó || là tốn tử nối chuỗi bit.
Chúng ta có thể mơ tả thuật tốn như sau:
1. Thêm các số không vào bên trái của K để tạo thành chuỗi b bit <i><small>K</small></i><sup>+</sup><sup>¿ ¿</sup>
2. XOR (bitwise exclusive-OR) <i><small>K</small></i><small>+¿ ¿</small>với ipad để tạo ra khối b bit <i><small>S</small><sub>i</sub></i>. 3. Nối chuỗi M vào <i><small>S</small><sub>i</sub></i>.
4. Áp dụng H vào luồng được tạo ra ở bước 3. 5. XOR <i><small>K</small></i><sup>+</sup><sup>¿ ¿</sup>với opad để tạo ra khối b bit <i><small>S</small><sub>o</sub></i>. 6. Nối chuỗi kết quả băm từ bước 4 vào <i><small>S</small><sub>o</sub></i>.
7. Áp dụng H vào luồng được tạo ra ở bước 6 và xuất ra kết quả.
Lưu ý rằng XOR với opad dẫn đến việc lật một nửa số bit của K. Tương tự, XOR với opad dẫn đến việc lật một nửa số bit của K, sử dụng một tập bit khác
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">nhau. Trên thực tế, bằng cách thông qua Si và So qua hàm nén của thuật tốn băm, chúng ta đã tạo ra hai khóa ngẫu nhiên từ K.
HMAC sẽ thực thi trong khoảng thời gian xấp xỉ như hàm băm được nhúng cho các thông điệp dài. HMAC bổ sung thêm ba lần thực thi hàm nén băm (cho <i><small>S</small><sub>i</sub></i>, So và khối được tạo ra từ băm bên trong).
Có thể thực hiện triển khai hiệu quả hơn, như được hiển thị trong Hình 12.6. Hai giá trị được tính trước:
f(IV, (<i><small>K</small></i><small>+¿ ¿</small>⊕ ipad)) f(IV, (<i><small>K</small></i><small>+¿ ¿</small>⊕ opad))
trong đó f(cv, block) là hàm nén cho hàm băm, lấy các tham số là biến xích của n bit và khối b bit và tạo ra biến xích của n bit. Các giá trị này chỉ cần được tính một lần ban đầu và mỗi khi khóa thay đổi. Trên thực tế, các giá trị được tính trước thay thế cho giá trị ban đầu (IV) trong hàm băm. Với triển khai này, chỉ có một trường hợp bổ sung của hàm nén được thêm vào quá trình xử lý thường được tạo ra bởi hàm băm. Triển khai hiệu quả hơn này đặc biệt có giá trị nếu hầu hết các thông điệp mà MAC được tính tốn đều ngắn.
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><i>Hình 12.6 Triển khai hiệu quả của HMAC</i>
<b>Tính bảo mật của HMAC</b>
Tính bảo mật của bất kỳ hàm MAC nào dựa trên hàm băm nhúng đều phụ thuộc theo một cách nào đó vào độ mạnh mật mã của hàm băm cơ bản. Điểm hấp dẫn của HMAC là các nhà thiết kế của nó đã có thể chứng minh được mối quan hệ chính xác giữa độ mạnh của hàm băm nhúng và độ mạnh của HMAC.
Tính bảo mật của hàm MAC thường được thể hiện dưới dạng xác suất thành công của việc giả mạo với một lượng thời gian nhất định mà kẻ giả mạo dành ra và một số lượng cặp tin nhắn-thẻ được tạo với cùng một khóa. Về cơ bản, đã được chứng minh trong [BELL96a] rằng đối với một mức độ nỗ lực nhất định (thời gian, cặp tin nhắn-thẻ) trên các tin nhắn được tạo bởi người dùng hợp pháp và được kẻ tấn cơng nhìn thấy, xác suất tấn cơng thành cơng HMAC tương đương với một trong những cuộc tấn công sau đây đối với hàm băm nhúng:
1. Kẻ tấn công có thể tính tốn kết quả của hàm nén ngay cả khi có IV ngẫu nhiên, bí mật và khơng được kẻ tấn cơng biết.
2. Kẻ tấn cơng tìm thấy va chạm trong hàm băm ngay cả khi IV ngẫu nhiên và bí mật.
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">Trong cuộc tấn cơng đầu tiên, chúng ta có thể xem hàm nén tương đương với hàm băm được áp dụng cho tin nhắn bao gồm một khối b bit duy nhất. Đối với cuộc tấn công này, IV của hàm băm được thay thế bằng giá trị ngẫu nhiên, bí mật n bit. Một cuộc tấn công vào hàm băm này yêu cầu một trong hai điều: tấn cơng brute-force vào khóa, là mức độ nỗ lực theo thứ tự <small>2</small><i><small>n</small></i>, hoặc tấn công sinh nhật, là một trường hợp đặc biệt của cuộc tấn công thứ hai, được thảo luận tiếp theo.
Trong cuộc tấn công thứ hai, kẻ tấn công đang tìm kiếm hai tin nhắn M và M′ tạo ra cùng một băm: H(M) = H(M′). Đây là cuộc tấn công sinh nhật được thảo luận trong Chương 11. Chúng tôi đã chỉ ra rằng điều này yêu cầu mức độ nỗ lực của <small>2</small><i><small>n/2</small></i>đối với chiều dài băm của n. Trên cơ sở này, tính bảo mật của MD5 bị nghi ngờ, vì mức độ nỗ lực của <small>264</small> có vẻ khả thi với cơng nghệ hiện nay. Điều này có nghĩa là một hàm băm 128 bit như MD5 không phù hợp với HMAC? Câu trả lời là khơng, vì lý do sau. Để tấn cơng MD5, kẻ tấn cơng có thể chọn bất kỳ tập tin nhắn nào và làm việc với chúng ngoại tuyến trên cơ sở máy tính chun dụng để tìm va chạm. Bởi vì kẻ tấn cơng biết thuật tốn băm và IV mặc định, kẻ tấn cơng có thể tạo mã băm cho mỗi tin nhắn mà kẻ tấn công tạo. Tuy nhiên, khi tấn công HMAC, kẻ tấn công không thể tạo các cặp tin nhắn/mã ngồi tuyến vì kẻ tấn cơng khơng biết K. Do đó, kẻ tấn cơng phải quan sát một chuỗi các tin nhắn được tạo bởi HMAC dưới cùng một khóa và thực hiện cuộc tấn công đối với các tin nhắn đã biết này. Đối với chiều dài mã băm 128 bit, điều này yêu cầu <small>2</small><sup>64</sup> khối được quan sát (<small>2</small><sup>72</sup>
bit) được tạo bằng cùng một khóa. Trên đường truyền 1 Gbps, người ta cần quan sát một luồng tin nhắn liên tục mà khơng thay đổi khóa trong khoảng 150.000 năm để thành cơng. Do đó, nếu tốc độ là một mối quan tâm, thì việc sử dụng MD5 thay vì SHA-1 làm hàm băm nhúng cho HMAC là hoàn toàn chấp nhận được.
<b>12.6 MAC dựa trên mã khối: DAA và CMAC</b>
Trong phần này, chúng ta xem xét hai MAC dựa trên việc sử dụng chế độ hoạt động của mã khối. Chúng ta bắt đầu với một thuật toán cũ hơn, Data Authentication Algorithm (DAA), hiện đã lỗi thời. Sau đó, chúng ta xem xét CMAC, được thiết kế để khắc phục những thiếu sót của DAA.
<b>Thuật tốn xác thực dữ liệu (DAA)</b>
Thuật toán xác thực dữ liệu (DAA), dựa trên DES, đã là một trong những MAC được sử dụng rộng rãi nhất trong nhiều năm. Thuật toán này là cả ấn phẩm FIPS (FIPS PUB 113) và tiêu chuẩn ANSI (X9.17). Tuy nhiên, như chúng ta sẽ thảo luận sau, những điểm yếu bảo mật trong thuật toán này đã được phát hiện và nó đang được thay thế bằng các thuật toán mới hơn và mạnh hơn.
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">Thuật tốn có thể được định nghĩa là sử dụng chế độ hoạt động chuỗi khối mã hóa (CBC) của DES (Hình 6.4) với vec tơ khởi tạo bằng 0. Dữ liệu (ví dụ: thơng điệp, bản ghi, tệp hoặc chương trình) được xác thực được nhóm thành các khối 64 bit liên tiếp: <i><small>D</small></i><sub>1</sub>, <i><small>D</small></i><sub>2</sub> , ..., <i><small>D</small><sub>N</sub></i>. Nếu cần, khối cuối cùng được đệm bên phải bằng các số 0 để tạo thành một khối 64 bit đầy đủ. Sử dụng thuật tốn mã hóa DES E và khóa bí mật K, mã xác thực dữ liệu (DAC) được tính như sau (Hình 12.7).
Hình 12.7 Thuật tốn xác thực dữ liệu (FIPS PUB 113)
DAC bao gồm toàn bộ khối ON hoặc M bit bên trái của khối, với 16 ≤ M ≤ 64.
<b>Mã xác thực thông điệp dựa trên mã hóa (CMAC)</b>
Như đã đề cập, DAA đã được áp dụng rộng rãi trong chính phủ và cơng nghiệp. [BELL00] đã chứng minh rằng MAC này an toàn theo một tập tiêu chí bảo mật hợp lý, với hạn chế sau. Chỉ các thơng điệp có độ dài cố định mn bit được xử lý, trong đó n là kích thước khối mã hóa và m là một số nguyên dương cố định. Ví dụ đơn giản, hãy lưu ý rằng cho trước CBC MAC của thông điệp một khối X, giả sử T = MAC(K, X), kẻ thù ngay lập tức biết CBC MAC cho thông điệp hai khối X || (X ⊕ T) vì đây một lần nữa là T.
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">Black và Rogaway [BLAC00] đã chứng minh rằng hạn chế này có thể được khắc phục bằng cách sử dụng ba khóa: một khóa K độ dài k được sử dụng ở mỗi bước của chuỗi khối mã hóa và hai khóa độ dài b, trong đó b là độ dài khối mã hóa. Cấu trúc được đề xuất này đã được Iwata và Kurosawa tinh chỉnh để hai khóa n bit có thể được suy ra từ khóa mã hóa, thay vì được cung cấp riêng biệt [IWAT03]. Sự tinh chỉnh này, được NIST chấp nhận, là chế độ hoạt động Mã xác thực thơng điệp dựa trên mã hóa (CMAC) để sử dụng với AES và triple DES. Nó được quy định trong ấn phẩm đặc biệt NIST 800-38B.
Trước tiên, hãy định nghĩa hoạt động của CMAC khi thông điệp là số nguyên bội n của độ dài khối mã hóa b. Đối với AES, b = 128 và đối với triple DES, b = 64. Thông điệp được chia thành n khối (<i><small>M</small></i><sub>1</sub>), <i><small>M</small></i><sub>2</sub>, ..., <i><small>M</small><sub>n</sub></i>). Thuật toán sử dụng khóa mã hóa K độ dài k và hằng số độ dài b, <i><small>K</small></i><sub>1</sub>]). Đối với AES, kích thước khóa k là 128, 192 hoặc 256 bit; đối với triple DES, kích thước khóa là 112 hoặc 168 bit. CMAC được tính như sau (Hình 12.8).
T = mã xác thực thông điệp, cũng được gọi là thẻ Tlen = độ dài bit
<i><small>MSB</small><sub>s</sub></i>(X) là s bit bên trái của chuỗi bit X
Nếu thông điệp không phải là số nguyên bội của độ dài khối mã hóa, thì khối cuối cùng được đệm bên phải (bit ít quan trọng nhất) với một 1 và càng nhiều 0 càng cần thiết để khối cuối cùng cũng có độ dài b. Q trình hoạt động của CMAC sau đó tiếp tục như trước, ngoại trừ việc sử dụng khóa b-bit <i><small>K</small></i><sub>2</sub> khác thay vì <i><small>K</small></i><sub>1</sub>.
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">(a) Độ dài thông điệp là bội số nguyên của kích thước khối
(b)Message length is not integer multiple of block size Hình 12.8 Mã xác thực thơng điệp dựa trên mã hóa (CMAC) Hai khóa b-bit được suy ra từ khóa mã hóa độ dài k như sau.
L = E(K, <small>0</small><i><sup>b</sup></i>)
<i><small>K</small></i><sub>1</sub> = L ⋅ x
<i><small>K</small></i><sub>2</sub> = L ⋅ <i><small>x</small></i><sup>2</sup>= (L ⋅ x) ⋅ x
trong đó phép nhân (⋅) được thực hiện trong trường hữu hạn GF(<small>2</small><i><sup>b</sup></i>) và x và <i><small>x</small></i><sup>2</sup> là đa thức bậc nhất và bậc hai là các phần tử của GF(2^b). Do đó, biểu diễn nhị phân của x bao gồm b - 2 số 0 theo sau là 10; biểu diễn nhị phân của x^2 bao gồm b - 3 số 0 theo sau là 100. Trường hữu hạn được định nghĩa theo một đa thức bất biến có thứ tự thứ tự đầu tiên trong số tất cả các đa thức như vậy với số lượng hạng không bằng 0 tối thiểu. Đối với hai kích thước khối được phê duyệt, các đa thức là <i><small>x</small></i><small>64</small> + <i><small>x</small></i><small>4</small>
+ <i><small>x</small></i><small>3</small> + x + 1 và <i><small>x</small></i><small>128</small> + <i><small>x</small></i><small>7</small> + <i><small>x</small></i><small>2</small> + x + 1.
Để tạo K1 và K2, mã khối được áp dụng cho khối chỉ bao gồm tất cả các bit 0. Khóa con đầu tiên được suy ra từ văn bản mã hóa kết quả bằng cách dịch một bit sang trái và, tùy thuộc, bằng cách XOR một hằng số phụ thuộc vào kích thước khối. Khóa con thứ hai được suy ra theo cách tương tự từ khóa con đầu tiên.
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">Tính chất này của các trường hữu hạn có dạng GF(<small>2</small><i><small>b</small></i>) đã được giải thích trong phần thảo luận về MixColumns trong Chương 6.
<b>12.7 Mật mã xác thực (AE)</b>
Mật mã xác thực (AE) là một thuật ngữ được sử dụng để mô tả các hệ thống mã hóa bảo vệ đồng thời tính bảo mật và tính xác thực (tính tồn vẹn) của thông tin liên lạc. Nhiều ứng dụng và giao thức yêu cầu cả hai loại bảo mật này, nhưng cho đến gần đây, hai dịch vụ này đã được thiết kế riêng biệt.
Có bốn cách phổ biến để cung cấp đồng thời tính bảo mật và mã hóa cho một thơng điệp M.
- Băm theo sau mã hóa (H <i><small>→</small></i> E): Đầu tiên, tính tốn hàm băm mật mã trên M là h = H (M). Sau đó mã hóa thông điệp cộng với hàm băm: E (K, (M||h)). - Xác thực theo sau mã hóa (A <i><small>→</small></i> E): Sử dụng hai khóa. Đầu tiên, xác thực
văn bản rõ bằng cách tính giá trị MAC là T = MAC (<i><small>K</small></i><sub>1</sub>, M). Sau đó mã hóa thơng điệp cộng với thẻ: E (<i><small>K</small></i><sub>2</sub>, [M || T]). Cách tiếp cận này được sử dụng bởi các giao thức SSL / TLS (Chương 17).
- Mã hóa theo sau xác thực (E <i><small>→</small></i> A): Sử dụng hai khóa. Đầu tiên, mã hóa thơng điệp để tạo ra văn bản mã C = E (<i><small>K</small></i><sub>2</sub>, M). Sau đó xác thực văn bản mã với T = MAC (<i><small>K</small></i><sub>1</sub>, C) để tạo ra cặp (C, T). Cách tiếp cận này được sử dụng trong giao thức IPSec (Chương 20).
- Mã hóa và xác thực độc lập (E + A): Sử dụng hai khóa. Mã hóa thơng điệp để tạo ra văn bản mã C = E (<i><small>K</small></i><sub>2</sub>, M). Xác thực văn bản rõ bằng T = MAC (<i><small>K</small></i><sub>1</sub>
, M) để tạo ra cặp (C, T). Các thao tác này có thể được thực hiện theo bất kỳ thứ tự nào. Cách tiếp cận này được sử dụng bởi giao thức SSH (Chương 17). Cả giải mã và xác minh đều đơn giản cho mỗi cách tiếp cận. Đối với H <i><small>→</small></i> E, A <i><small>→</small></i> E và E + A, giải mã trước, sau đó xác minh. Đối với E <i><small>→</small></i> A, xác minh trước, sau đó giải mã. Có lỗ hổng bảo mật với tất cả các cách tiếp cận này. Cách tiếp cận H <i><small>→</small></i> E được sử dụng trong giao thức WEP (Wired Equivalent Privacy) để bảo vệ mạng WiFi. Cách tiếp cận này có những điểm yếu cơ bản và dẫn đến việc thay thế giao thức WEP. [BLAC05] và [BELL00] chỉ ra rằng có những mối quan ngại bảo mật trong mỗi ba cách tiếp cận mã hóa / MAC được liệt kê ở trên. Tuy nhiên, với thiết kế phù hợp, bất kỳ cách tiếp cận nào trong số này đều có thể cung cấp mức độ bảo mật cao. Đây là mục tiêu của hai cách tiếp cận được thảo luận trong phần này, cả hai đều đã được NIST chuẩn hóa.
<b>Mật mã xác thực khối với mã xác thực thơng điệp xích khối (CCM)</b>
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">Chế độ hoạt động CCM đã được NIST chuẩn hóa đặc biệt để hỗ trợ các yêu cầu bảo mật của mạng cục bộ không dây WiFi IEEE 802.11 (Chương 18), nhưng có thể được sử dụng trong bất kỳ ứng dụng mạng nào yêu cầu mã hóa xác thực. CCM là một biến thể của phương pháp mã hóa và MAC để mã hóa xác thực. Nó được định nghĩa trong NIST SP 800-38C.
Các thành phần thuật tốn chính của CCM là thuật tốn mã hóa AES (Chương 6), chế độ hoạt động CTR (Chương 7) và thuật toán xác thực CMAC (Phần 12.6). Một khóa duy nhất K được sử dụng cho cả thuật tốn mã hóa và MAC.
Đầu vào cho q trình mã hóa CCM bao gồm ba yếu tố:
1. Dữ liệu sẽ được cả xác thực và mã hóa. Đây là thơng điệp văn bản rõ P của khối dữ liệu.
2. Dữ liệu liên quan A sẽ được xác thực nhưng không được mã hóa. Một ví dụ là một tiêu đề giao thức phải được truyền dưới dạng văn bản rõ để hoạt động giao thức đúng nhưng cần được xác thực.
3. Một nonce N được gán cho tải trọng và dữ liệu liên quan. Đây là một giá trị duy nhất khác nhau cho mọi phiên bản trong thời gian tồn tại của liên kết giao thức và được dùng để ngăn chặn các cuộc tấn công phát lại và một số loại tấn cơng khác.
Hình 12.9 minh họa hoạt động của CCM. Để xác thực, đầu vào bao gồm nonce, dữ liệu liên quan và văn bản rõ. Đầu vào này được định dạng thành một chuỗi các khối <i><small>B</small></i><sub>0</sub> đến <i><small>B</small><sub>r</sub></i>. Khối đầu tiên chứa nonce cộng với một số bit định dạng chỉ ra độ dài của các phần tử N, A và P. Tiếp theo là không hoặc nhiều khối chứa A, tiếp theo là không hoặc nhiều khối chứa P. Chuỗi các khối kết quả được sử dụng làm đầu vào cho thuật toán CMAC, tạo ra giá trị MAC có độ dài Tlen, nhỏ hơn hoặc bằng độ dài khối (Hình 12.9a).
Để mã hóa, một chuỗi các bộ đếm được tạo ra phải độc lập với nonce. Thẻ xác thực được mã hóa ở chế độ CTR sử dụng bộ đếm duy nhất <i><small>Ctr</small></i><sub>0</sub>. Tlen bit có ý nghĩa nhất của đầu ra được XOR với thẻ để tạo ra thẻ được mã hóa. Các bộ đếm còn lại được sử dụng cho mã hóa chế độ CTR của văn bản rõ (Hình 7.7). Văn bản rõ được mã hóa được ghép với thẻ được mã hóa để tạo thành đầu ra mã hóa (Hình 12.9b).
SP 800-38C định nghĩa quy trình xác thực/mã hóa như sau:
1. Áp dụng hàm định dạng cho (N, A, P) để tạo ra các khối <i><small>B</small></i><sub>0</sub>, <i><small>B</small></i><sub>1</sub>, … , <i><small>B</small><sub>r</sub></i>,. 2. Đặt <i><small>Y</small></i><sub>0</sub> = E(K, <i><small>B</small></i><sub>0</sub>).
3. Đối với i từ 1 đến r, thực hiện <i><small>Y</small><sub>i</sub></i> = E(K, (<i><small>B</small><sub>i</sub></i> ⊕ <i><small>Y</small><sub>i−1</sub></i>)). 4. Đặt T = <i><small>MSB</small><sub>Tlen</sub></i> (<i><small>Y</small><sub>r</sub></i>).
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">5. Áp dụng hàm tạo bộ đếm để tạo ra các khối bộ đếm <i><small>Ctr</small></i><sub>0</sub>, <i><small>Ctr</small></i><sub>1</sub>, ..., <i><small>Ctr</small><sub>m</sub></i>. trong đó m = ⌈ Plen/128 ⌉.
6. Đối với j từ 0 đến m, thực hiện Sj = E(K, <i><small>Ctr</small><sub>j</sub></i>). 7. Đặt S = <i><small>S</small></i><sub>1</sub>, || <i><small>S</small></i><sub>2</sub> || ... || <i><small>S</small><sub>m</sub></i>.
8. Trả về C = (P ⊕ <i><small>MSB</small><sub>Tlen</sub></i>(S)) || (T ⊕ (<i><small>S</small></i><sub>0</sub>)).
Để giải mã và xác minh, người nhận cần các đầu vào sau: văn bản mã C, nonce N, dữ liệu liên quan A, khóa K và bộ đếm ban đầu <i><small>Ctr</small></i><sub>0</sub>. Các bước như sau:
1. Nếu Clen <i><small>≤</small></i> Tlen, thì trả về INVALID.
Áp dụng hàm tạo bộ đếm để tạo ra các khối bộ đếm <i><small>Ctr</small></i><sub>0</sub>, <i><small>Ctr</small></i><sub>1</sub>, ..., <i><small>Ctr</small><sub>m</sub></i>, trong
</div>