Điểm:4

Nhiều va chạm gần nhưng không va chạm hoàn toàn

lá cờ in

Tôi đọc câu hỏi này: Bẻ khóa $f(x) = Cx \oplus Dx$ Hỏi về việc tìm kiếm các xung đột trong một hàm băm 64 bit đơn giản và tôi nghĩ rằng tôi sẽ tự mình thử chỉ để giải trí. Tôi nhanh chóng viết mã để tìm va chạm: https://gist.github.com/meirmaor/b0e59352eb73cacec47d0f95c25a25fc

Tuy nhiên, nó tìm thấy nhiều va chạm gần và không có va chạm hoàn toàn, điều này gây trở ngại cho tôi.

Mô tả thuật toán: Tôi muốn giải quyết vấn đề này bằng 8GB Ram, vì vậy tôi phân bổ hai mảng Int có độ dài $2^{30}$ *(4 byte int) mỗi cái. Tôi điền chúng bằng cách băm các giá trị Int, tôi lấy 30 bit thấp hơn làm chỉ mục vào cả hai mảng và lưu trữ 32 bit trên cùng trong mảng đầu tiên và int nguồn trong mảng thứ hai.

tôi cư sử dụng $2^{32}$ các giá trị Int có thể (dưới dạng mảng byte) và nhận được tỷ lệ lấp đầy 98% như mong đợi, thay đổi gần với tỷ lệ lý tưởng hóa $1-e^{-4}$ Tôi mong chờ.

Nó giống như một bảng băm nhưng tôi không xử lý xung đột, chỉ giữ một giá trị duy nhất cho mỗi khóa băm 30 bit. Về cơ bản, đây là ánh xạ giữa hàm băm 62 bit bị cắt ngắn thành gốc 32 bit.

Sau đó, tôi thử băm các giá trị dài hơn với tiền tố Int bổ sung và tìm kiếm các xung đột, một lần nữa sử dụng 30 bit thấp hơn làm chỉ mục cho mảng, kiểm tra xem 32 đầu có khớp không và chúng tôi có tìm thấy xung đột gần không. Tuy nhiên, khi xác minh chúng, tôi thấy không có va chạm hoàn toàn, cho đến nay tôi đã tìm thấy hơn 60 va chạm gần, xác thực chúng một cách riêng biệt, chúng thực sự khớp ở 62 hoặc 63 bit, nhưng tôi đã mong đợi 1/4 là va chạm hoàn toàn, tôi nhận được 0.

Tôi đã lặp lại thử nghiệm hai lần trước tiên so sánh các giá trị băm 4 byte với giá trị băm 8 byte bắt đầu bằng các byte {số nhỏ,0,0,0}. Sau đó, tôi đã thử so sánh các giá trị băm có độ dài bằng nhau bằng cách điền trước các giá trị băm của dữ liệu bắt đầu bằng chuỗi byte {1,0,0,0} và so sánh lại với tiền tố {2+,0,0,0}

Làm thế nào là điều này có thể, một cái gì đó đặc biệt trong hàm băm này? Một lỗi lạ trong mã của tôi cho phép tôi tìm thành công các va chạm gần nhưng không có va chạm đầy đủ? Có lý do nào khiến các vụ va chạm được tìm thấy theo cách này sẽ không biến thành các vụ va chạm hoàn toàn không.

Một ví dụ về một vụ va chạm gần được tìm thấy (tôi có nhiều):

Mảng(24, 0, 0, 0, 14, 103, 61, 80) so với Mảng(1, 0, 0, 0, -2, -81, 79, 79)

Meir Maor avatar
lá cờ in
Lần thử tiếp theo của tôi sẽ là bộ nhớ O(1) thuật toán hai ngón tay, nhưng tôi vẫn không biết tại sao lần thử đầu tiên lại thất bại.
Điểm:5
lá cờ ng

Bổ sung quan trọng muộn: Bây giờ tôi nhận ra mã cố gắng tìm xung đột cho 64-bit $\operatorname{hash}$ chấp nhận tin nhắn 64-bit. Nếu đó $\operatorname{hash}$ là một bijection, nó sẽ không va chạm. Có một sự liên tục giữa một phép loại bỏ và một hàm ngẫu nhiên, và không có bảo hiểm nào $\operatorname{hash}$ hành xử chủ yếu giống như sau này. Ngược lại, đó là chức năng bên trong $f(x)=C\,x\oplus D\,x\bmod2^{64}$ không có khuếch tán phải. Đó là, $x\equiv x'\pmod{2^i}\ngụ ý f(x)\equiv f(x')\pmod{2^i}$, do đó $f$ là một hàm băm vòng kém. Điều này có thể giải thích ít nhất một phần khó khăn trong việc tìm ra xung đột bằng các phương pháp được thiết kế cho các hàm ngẫu nhiên. Sau này tôi giả sử một trong số:

  • không gian tin nhắn cho $x$$b$-bit với $b$ lớn hơn đáng kể so với (đầu ra 64-bit)
  • chúng tôi cố gắng tìm va chạm $x,x'$ như vậy mà $\operatorname{hash}(p\mathbin\|x)=\operatorname{hash}(p'\mathbin\|x')$ ở đâu $p$$p'$ là các tiền tố riêng biệt cố định, $x,x'$$b=64$-chút, $x\ne x'$.

Tôi nghi ngờ một vấn đề quan trọng khác là trong

Tôi điền (các mảng) bằng cách băm các giá trị Int

nó được băm gia tăng Giá trị int. Hoàn toàn khả thi để tạo một hàm sao cho các giá trị gia tăng trong một khoảng thời gian lớn không xung đột và hoàn toàn có thể là hàm $\operatorname{hash}$ tìm kiếm xung đột hoạt động như vậy, do đó mọi nỗ lực tìm xung đột giữa các giá trị liên tiếp đều thất bại.

Như một ví dụ về hàm không có xung đột cho đầu vào trong một khoảng thời gian nhỏ, hãy xem xét $H(x)=\left(263x+\left(\operatorname{MD5}(x)\bmod256\right)\right)\bmod2^{64}$. Nó giữ $H(x)-H(x')\equiv263(x-x')+(r-r')\pmod{2^{64}}$, với $r,r'\in[0,255]$ vì chúng được lấy dưới dạng byte cuối cùng của MD5; do đó $\lvert r-r'\rvert<256$. Do đó nếu $x\ne x'$, cách duy nhất để có được $H(x)=H(x')$ đó là $\lvert x-x'\rvert$ lớn, ít nhất $\ltầng 2^{64}/263\rtầng$, đó sẽ không phải là trường hợp liên tiếp $x$ trong một khoảng nhỏ.

Khi cố gắng tìm xung đột cho hàm băm ngẫu nhiên không đầy đủ như vậy $H$, một cách khắc phục dễ dàng là tìm xung đột cho hàm ngẫu nhiên hơn $x\mapsto H(G(x))$, được xây dựng bằng cách sử dụng một số phép chiếu phụ trợ giả ngẫu nhiên $G$, ví dụ. $G(x)=G_2(G_1(G_0(x)))$ với $G_i(x)=k_i(x\oplus(x\gg\lceil b/3+1\rceil))\bmod2^b$$k_i$ ngẫu nhiên $b$hằng số -bit [trong đó $\gg$ là dịch chuyển phải, và $b$ là kích thước bit của $x$]. Một lần va chạm $x,x'$ được tìm thấy với $H(G(x))=H(G(x'))$ nhưng $x\ne x'$, va chạm cho $H$$G(x),G(x')$.


Một lợi thế của việc tìm kiếm các va chạm với Pollard's rho với các điểm phân biệt (chứ không phải phương pháp trong mã của câu hỏi) là bản chất lặp đi lặp lại của nó thường giải quyết vấn đề về một hàm không đủ ngẫu nhiên được tìm kiếm cho các va chạm mà không cần một phụ trợ. $G$; hoặc, tương đối đơn giản $G$ sẽ làm (ở đây tôi nghĩ rằng một vòng quay 1 bit trong phản hồi của rho của Pollard nên làm, bù cho việc thiếu khuếch tán bên phải). Ngoài ra, Pollard's rho sử dụng ít bộ nhớ hơn, do đó hoạt động với các giá trị băm lớn hơn; và đối với các hàm băm nhanh, nó nhanh hơn vì nó thân thiện với bộ đệm.

kodlu avatar
lá cờ sa
đẹp. có lý do đại số sâu sắc nào trong hàm băm liên quan đến MD5 của bạn không thích xung đột đối với các giá trị số nguyên tuần tự không? khác với 263 tương đối nguyên tố đối với mô-đun có liên quan?không thể nói trong nháy mắt
Reppiz avatar
lá cờ gb
cá nhân tôi không thực sự hiểu làm thế nào, tương ứng tại sao bản sửa lỗi G hoạt động. Có giải thích nào khác (hoặc sâu hơn) không? Ngoài ra, một liên kết đến một bài báo, blog, bài viết, v.v ... mà bằng cách nào đó mô tả phương pháp này sẽ làm được.
fgrieu avatar
lá cờ ng
@Reppiz: Bây giờ tôi cố gắng đưa ra lý do. Về bản chất, nếu chúng tôi gặp vấn đề với $H$ vì nó không đủ ngẫu nhiên, thì chúng tôi sẽ làm cho nó trở nên ngẫu nhiên hơn bằng cách giới thiệu $G$.
fgrieu avatar
lá cờ ng
@Meir Maor: nhớ đọc phần giới thiệu mới!
Meir Maor avatar
lá cờ in
Vâng, tôi đã lo lắng về điều đó, và điều này đang phát triển thành một câu trả lời thực sự tuyệt vời. Có một số sai sót trong nỗ lực của tôi. Tuy nhiên, thành công của tôi trong việc tìm kiếm các va chạm gần ở mức (ít hơn một chút nhưng không ít hơn nhiều) so với tỷ lệ dự kiến ​​đã khiến tôi thất vọng.
Điểm:2
lá cờ cn

Quá không uy tín để bình luận ...

Tôi cho rằng đó là sự cố triển khai - mô tả cấp cao của phương pháp này có vẻ hợp lý. Nó có thể tìm thấy xung đột không nếu bạn sử dụng các tiền tố thay vì 0x010000990xDEADBD5C?

tiết lộ: ví dụ. 0x010000992287FF50 so với 0xDEADBD5C05F19159

Phương pháp được sử dụng để tìm xung đột này về cơ bản giống như phương pháp bạn mô tả, ngoại trừ việc tôi cũng đã sử dụng phương pháp đó nếu chúng tôi có thể tìm thấy xung đột của 56 byte quan trọng nhất của hàm băm (hoặc, về mặt kỹ thuật, hàm băm không có giá trị cuối cùng ứng dụng của f), thì việc mở rộng các chuỗi byte thêm một byte mỗi chuỗi để có xung đột đầy đủ (64 bit) là chuyện nhỏ.

fgrieu avatar
lá cờ ng
Điều đó có vẻ hợp pháp như một câu trả lời (chứ không phải nhận xét) đối với tôi, ngay cả khi nó trả lời "tại sao không tìm thấy va chạm" bởi "nên có"; và tôi có một lời giải thích thay thế.
Meir Maor avatar
lá cờ in
Cốt truyện dày lên, với các tiền tố này, mã của tôi tìm thấy 65 lần va chạm gần và 64 trong số chúng trở thành va chạm hoàn toàn. Trong một hàm lý tưởng, tôi dự kiến ​​sẽ tìm thấy một xung đột gần duy nhất trong mỗi cặp tiền tố (vì tôi chỉ lưu trữ 1/4 giá trị được băm trong tiền tố đầu tiên)
Maarten Bodewes avatar
lá cờ in
Một cái gì đó mod 127 hoặc tương tự?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.