Học máy có thể giải mã băm SHA256 không?


43

Tôi có hàm băm SHA256 64 ký tự.

Tôi hy vọng sẽ đào tạo một mô hình có thể dự đoán liệu bản rõ được sử dụng để tạo hàm băm có bắt đầu bằng 1 hay không.

Bất kể nếu đây là "Có thể", thuật toán nào sẽ là cách tiếp cận tốt nhất?

Suy nghĩ ban đầu của tôi:

  • Tạo một mẫu băm lớn bắt đầu bằng 1 và một mẫu băm lớn không bắt đầu bằng 1
  • Đặt từng trong số 64 ký tự của hàm băm làm tham số cho một số mô hình hồi quy logistic không giám sát.
  • Huấn luyện mô hình bằng cách nói với nó khi nó đúng / sai.
  • Hy vọng có thể tạo ra một mô hình có thể dự đoán nếu bản rõ bắt đầu bằng 1 hay không với độ chính xác đủ cao (và với một kappa đàng hoàng)

22
FYI: Điều này có khả năng được thúc đẩy bởi khai thác bitcoin.
ClojureMostly

55
Làm thế nào tôi có thể đào tạo một mô hình cho phép tôi du hành thời gian, bất kể điều này là 'có thể'?
W.

13
@Joshua OP muốn đảo ngược SHA-256. Tôi sẽ cho anh ấy xuất bản ngay cả khi phải mất gấp ngàn lần so với SHA-256. Tôi cũng sẽ ngừng tồn tại vì giải pháp gần như chắc chắn khai thác một lỗi trong chính kết cấu thực tế để đánh bại logic.
Konrad Rudolph

15
Tất cả các giá trị băm SHA256 có thể được tạo bởi một chuỗi bắt đầu bằng "1".
Phản ứng

8
@cgTag Tôi xin lỗi nhưng điều đó chỉ sai. Đầu vào không kiểm soát đầu ra, nếu không nó sẽ không phải là một chức năng ở nơi đầu tiên. Ngoài ra, chỉ vì bạn có một danh sách vô hạn các thứ, điều đó không có nghĩa là một trong số chúng bắt đầu bằng 1. Bạn đang cố gắng chứng minh một phỏng đoán mật mã đã biết trong một nhận xét SE. Lưu ý: Tôi cũng tin đó là sự thật, nhưng khẳng định nó là sự thật là sai lệch. Nếu bạn đúng, chắc chắn sẽ có một bài báo hoặc một số tài liệu tham khảo khác.
Pedro A

Câu trả lời:


98

Đây thực sự không phải là một câu trả lời thống kê, nhưng:

Không , bạn không thể xác định ký tự đầu tiên của văn bản gốc từ hàm băm, bởi vì không có thứ gọi là "bản rõ" cho một hàm băm nhất định.

SHA-256 là một thuật toán băm. Bất kể văn bản gốc của bạn là gì, bạn nhận được chữ ký 32 byte, thường được biểu thị dưới dạng chuỗi hex 64 ký tự. Có rất nhiều các bản rõ có thể có nhiều hơn các chuỗi hex 64 ký tự có thể - cùng một hàm băm có thể được tạo từ bất kỳ số lượng các bản rõ khác nhau. Không có lý do gì để tin rằng ký tự đầu tiên / không phải là '1' là đồng nhất trên tất cả các bản rõ tạo ra một hàm băm nhất định.


21
Đây là cho đến nay (theo tôi) câu trả lời đúng duy nhất. Tất cả các câu trả lời khác dường như giải quyết nhiều hơn về vấn đề học hàm băm hơn là học cách đảo ngược hàm băm (câu hỏi thực tế). Tất cả họ dường như bỏ qua rằng băm nó không phải là một chức năng tiêm.
Luca Citi

7
Bạn có thể không dự đoán xác suất rằng char đầu tiên là một? Thiếu một-một-một không phải là một vấn đề hiếm gặp trong học tập thống kê.
Matthew Drury

16
@MatthewDrury Cho rằng SHA256 được thiết kế để làm cho tất cả các đầu vào có khả năng như nhau cho một hàm băm nhất định, hy vọng sẽ có vô số đầu vào bắt đầu bằng 1, cho bất kỳ hàm băm nào . Vì vậy, nếu bạn muốn ước tính xác suất, ước tính tốt nhất của bạn sẽ là khoảng . 1256±ε
Konrad Rudolph

12
Yup, đồng ý. Tôi chỉ muốn lưu ý rằng việc thiếu tính tiêm truyền không thực sự là một vấn đề cấu trúc với việc áp dụng học máy.
Matthew Drury

6
@IMil Lý do tôi đề cập cụ thể thực tế đó là hàm băm không phải là đề xuất không có hàm băm nào có thể tiết lộ thông tin đó, nhưng để thúc đẩy tuyên bố rằng không có thứ gọi là "bản rõ". Chắc chắn, hàm băm (xấu) có thể đảo ngược một phần và cho chúng ta biết điều gì đó về toàn bộ tập hợp các nguyên đơn sẽ tạo ra nó, nhưng không có lý do gì để tin rằng SHA-256.
Chris H

51

SHA256 được thiết kế ngẫu nhiên nhất có thể, do đó, không có khả năng bạn có thể tách các băm xuất phát từ bản rõ có tiền tố 1 từ các bản không có tiền tố; đơn giản là không có tính năng nào của chuỗi băm sẽ cung cấp thông tin đó.


5
"Không chắc" và "nên" - Đó là những gì thuật toán sẽ cho tôi biết. Thoạt nhìn có vẻ là không thể, nhưng tôi muốn biết nên sử dụng thuật toán và phương pháp nào để kiểm tra giả thuyết này.
Giăng

24
+1 Đảm bảo rằng bất kỳ loại "mô hình hồi quy logistic không giám sát" nào cũng sẽ không thể làm tốt hơn việc đoán trừ khi nó có thể được cung cấp một số lượng lớn các trường hợp thực sự. Vấn đề này đang nghiêng tại cối xay gió.
whuber

44
Bạn có thể thử nó, nhưng người học sẽ cố gắng tìm một mối quan hệ thống kê được thiết kế có chủ ý không tồn tại.
Pavel Komarov

32
"Được thiết kế để ngẫu nhiên nhất có thể" là một cách đánh giá thấp. Cụ thể, thiết kế nhằm mục đích có một phụ thuộc phi tuyến tính tối đa, trong đó mỗi bit đầu vào ảnh hưởng khoảng 50% các bit đầu ra và mỗi bit đầu ra phụ thuộc vào khoảng 50% các bit đầu vào. Điều này được gọi là nhầm lẫn và khuếch tán . Nó làm cho nhiệm vụ ở đây (chỉ phục hồi bit đầu tiên) cũng khó như khôi phục toàn bộ tin nhắn.
MSalters

12
Tôi nghĩ rằng bạn có thể tăng cường "không thể" trong câu trả lời này. OP không có cơ hội áp dụng các kỹ thuật dựa trên thống kê để dự đoán bất kỳ phần nào của hàm băm SHA256 từ nội dung, hoặc ngược lại, thậm chí có thể cải thiện khả năng đoán ngẫu nhiên. Giải pháp thực tế về cơ bản là tính toán trước toàn bộ dân số mục tiêu của nội dung ban đầu.
Neil Slater

43

Bất kể nếu đây là "Có thể", thuật toán nào sẽ là cách tiếp cận tốt nhất?

Xin lỗi, nhưng đó là một câu hỏi vô nghĩa. Nếu điều gì đó là không thể, thì bạn không thể tìm kiếm cách tiếp cận tốt nhất cho vấn đề.

Trong trường hợp này, điều này chắc chắn là không thể vì băm là hàm một chiều: một số đầu vào (vô hạn, trên thực tế) có thể tạo ra cùng một đầu ra. Nếu bit đầu tiên của chính nó bằng cách nào đó sẽ ảnh hưởng đến xác suất của một giá trị băm cụ thể, điều này có nghĩa là thuật toán băm hoàn toàn thiếu sót.

Bạn chắc chắn có thể đào tạo một mạng lưới thần kinh, phân loại tuyến tính, SVM và không có gì để cố gắng dự đoán. Và nếu bạn có thể dự đoán một cách đáng tin cậy đầu vào từ đầu ra cho một thuật toán băm nhất định, điều này sẽ chứng minh rằng thuật toán này là vô giá trị. Tôi muốn nói rằng đối với một thuật toán được sử dụng rộng rãi như SHA256 thì khả năng như vậy là rất thấp. Tuy nhiên, đó là một cách tiếp cận hợp lý để nhanh chóng loại trừ các thuật toán băm mới, chưa được kiểm chứng và chưa được kiểm chứng.


6
Điều gần như không liên quan là hàm băm là hàm một chiều: Ngoài đỉnh đầu tôi có thể nghĩ ra rất nhiều hàm một chiều, tuy nhiên cho phép tôi suy ra các tính năng của đầu vào ban đầu ( , nổi tiếng là hàm một chiều phi tuyến tính, cho tôi biết rất nhiều về đầu vào). sign(x)
Konrad Rudolph

11
@KonradRudolph: "Hàm một chiều" có một ý nghĩa cụ thể trong ngữ cảnh này không phải là ý nghĩa mà bạn nghĩ đến. sign(x)không phải là một chức năng một chiều theo nghĩa này, bởi vì việc tìm kiếm các tiền đề là chuyện nhỏ.
user2357112

4
Điều đó nói rằng, tôi cũng không nghĩ câu trả lời là sử dụng "hàm một chiều" một cách chính xác.
user2357112

1
@ user2357112 Cảm ơn, tôi không biết điều đó. Tôi chỉ biết ý nghĩa như là một hàm có tính từ chứ không phải tính từ. Đó cũng là định nghĩa được đưa ra trong câu trả lời, đó là điều tôi phản đối.
Konrad Rudolph

1
Vâng, xin lỗi, tôi hơi lỏng lẻo với các định nghĩa. Tuy nhiên, tôi tin rằng "một chiều" dễ hiểu đối với người mới hơn là những điều khoản khắt khe hơn.
IMil

26

Trong khi người ta không thể chứng minh một tiêu cực với một ví dụ. Tuy nhiên, tôi cảm thấy một ví dụ sẽ được gợi ý; và có lẽ hữu ích. Và nó cho thấy cách người ta (cố gắng) giải quyết các vấn đề tương tự.

Trong trường hợp tôi muốn đưa ra dự đoán nhị phân, sử dụng các tính năng là vectơ nhị phân , Rừng ngẫu nhiên là một lựa chọn chắc chắn. Tôi đoán loại câu trả lời này phần thứ hai của câu hỏi của bạn: một thuật toán tốt là gì.

Chúng tôi cũng muốn tiền xử lý các chuỗi SHA256, thành các vectơ nhị phân (Boolean), vì mỗi bit là độc lập thống kê, do đó mỗi bit là một tính năng tốt. Vì vậy, điều đó sẽ làm cho đầu vào 256 vectơ boolean phần tử của chúng tôi.

Bản giới thiệu

Dưới đây là một minh chứng về cách toàn bộ điều có thể được thực hiện bằng cách sử dụng Julia DecisionTree.jl thư viện.

Bạn có thể sao chép dán bên dưới vào dấu nhắc julia.

using SHA
using DecisionTree
using Statistics: mean
using Random: randstring

const maxlen=10_000 # longest string (document) to be hashed.

gen_plaintext(x) = gen_plaintext(Val{x}())
gen_plaintext(::Val{true}) = "1" * randstring(rand(0:maxlen-1))
gen_plaintext(::Val{false}) = randstring(rand(1:maxlen))


bitvector(x) = BitVector(digits(x, base=2, pad=8sizeof(x)))
bitvector(x::AbstractVector) = reduce(vcat, bitvector.(x))

function gen_observation(class)
    plaintext = gen_plaintext(class)
    obs = bitvector(sha256(plaintext))
    obs
end

function feature_mat(obs)
    convert(Array, reduce(hcat, obs)')
end

########################################

const train_labels = rand(Bool, 100_000)
const train_obs = gen_observation.(train_labels)
const train_feature_mat = feature_mat(train_obs)

const test_labels = rand(Bool, 100_000)
const test_obs = gen_observation.(test_labels)
const test_feature_mat = feature_mat(test_obs)


# Train the model
const model = build_forest(train_labels, train_feature_mat)
@show model


#Training Set accuracy:
@show mean(apply_forest(model, train_feature_mat) .== train_labels)

#Test Set accuracy:
@show mean(apply_forest(model, test_feature_mat) .== test_labels)

Các kết quả

Khi tôi làm điều này, đào tạo trên 100.000 chuỗi ASCII ngẫu nhiên có độ dài lên tới 10.000. Đây là kết quả tôi thấy:

Đào tạo người mẫu

julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees:      10
Avg Leaves: 16124.7
Avg Depth:  17.9

Độ chính xác của bộ đào tạo:

julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162

Kiểm tra độ chính xác của bộ:

julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016

Thảo luận

Vì vậy, về cơ bản là không có gì. Chúng tôi đã đi từ 95% trên tập huấn luyện, đến gần 50% trên tập kiểm tra. Ai đó có thể áp dụng các bài kiểm tra giả thuyết phù hợp, để xem liệu chúng ta có thể từ chối
giả thuyết không, nhưng tôi khá chắc chắn rằng chúng ta không thể. Đó là một cải tiến nhỏ so với tỷ lệ đoán.

Điều đó cho thấy rằng nó không thể được học. Nếu là Rừng ngẫu nhiên, có thể chuyển từ trang bị tốt sang chỉ đạt tỷ lệ đoán. Rừng ngẫu nhiên khá có khả năng học các đầu vào khó khăn. Nếu có điều gì đó để học, tôi sẽ mong đợi ít nhất vài phần trăm.

Bạn có thể chơi xung quanh với các hàm băm khác nhau bằng cách thay đổi mã. Điều thú vị là tôi có kết quả cơ bản giống nhau khi sử dụng hàm julia trong hashhàm dựng sẵn (không phải là một hsah bảo mật bằng mật mã, nhưng vẫn là một hàm băm tốt nên thực sự nên tách các chuỗi tương tự nhau). Tôi cũng đã nhận được kết quả tương tự cho CRC32c.


15

Các hàm băm (theo thiết kế) cực kỳ phù hợp để làm bất cứ điều gì máy học với chúng.

ML thực chất là một nhóm các phương thức để mô hình hóa / ước tính các hàm liên tục cục bộ . Tức là, bạn đang cố gắng mô tả một số hệ thống vật lý, trong khi nó có thể có một số điểm không nhất định, theo một nghĩa nào đó trong hầu hết không gian tham số đủ mịn để chỉ có thể sử dụng một mẫu dữ liệu thử nghiệm phân tán để dự đoán kết quả cho người khác đầu vào. Để làm được điều đó, các thuật toán AI cần bằng cách nào đó phân tách dữ liệu thành một biểu diễn cơ sở thông minh, trong đó đào tạo đã gợi ý rằng, ví dụ như nếu bạn thấy hình dạng như vậy và có vẻ tương quan với kết quả của sự kết hợp như vậy và như vậy) thì sẽ có một cơ hội tốt mà đầu ra nên có trong khu vực tương ứng như vậy và cấu trúc như vậy (một lần nữa có thể được mô tả bằng một tích chập hoặc một cái gì đó).

(Tôi biết, nhiều cách tiếp cận ML hoàn toàn không giống như tích chập, nhưng ý tưởng chung luôn giống nhau: bạn có một số không gian đầu vào rất cao, không thể lấy mẫu một cách triệt để, vì vậy bạn tìm thấy một phép phân tách thông minh cho phép bạn ngoại suy kết quả từ một mẫu tương đối thưa thớt.)

Tuy nhiên, ý tưởng đằng sau hàm băm mật mã là bất kỳ thay đổi nào đối với bản rõ sẽ dẫn đến một bản tóm tắt hoàn toàn khác. Vì vậy, cho dù bạn phân tách hàm như thế nào, các công cụ ước tính cục bộ sẽ không cho phép bạn ngoại suy cách các dao động nhỏ xung quanh phần đó ảnh hưởng đến kết quả. Tất nhiên trừ khi bạn thực sự xử lý tất cả thông tin của một bộ hạn chế, nhưng điều này sẽ không được gọi là học máy: bạn sẽ chỉ xây dựng một bảng cầu vồng .


4
Đọc sách này, nó xảy ra với tôi rằng một) để xây dựng một bảng cầu vồng, bạn cần phải biết hàm băm những gì để sử dụng, và b) nó có thể được có thể cho một máy học thuật toán để xác định thuật toán được sử dụng, đưa ra một đủ lớn mẫu đầu vào và đầu ra (ít nhất là nếu thuật toán có lỗ hổng nhận dạng). Vì vậy, nếu vấn đề ban đầu được trình bày lại là về một hàm băm không xác định cần được xác định, thì nó có thể thực tế thú vị hơn.
gửi

7

Đây là một câu hỏi thú vị bởi vì nó đặt ra vấn đề về cái được coi là "học máy". Chắc chắn có một thuật toán cuối cùng sẽ giải quyết vấn đề này nếu nó có thể được giải quyết. Nó như thế này:

  1. Chọn ngôn ngữ lập trình yêu thích của bạn và quyết định mã hóa ánh xạ mọi chuỗi thành một số nguyên (có khả năng rất lớn).

  2. Chọn một số ngẫu nhiên và chuyển đổi nó thành một chuỗi. Kiểm tra xem nếu đó là một chương trình hợp lệ trong ngôn ngữ của bạn. Nếu không, hãy chọn một số khác và thử lại. Nếu có, hãy khởi động nó, ngay lập tức tạm dừng nó và thêm nó vào danh sách các chương trình bị tạm dừng.

  3. Chạy tất cả các chương trình tạm dừng một chút. Nếu bất kỳ ai trong số họ dừng lại mà không tạo ra một giải pháp thích hợp, hãy xóa chúng khỏi danh sách. Nếu một giải pháp phù hợp, bạn đã hoàn thành! Nếu không, quay trở lại 2 sau khi để tất cả chúng chạy một chút.

Không có câu hỏi rằng nếu bạn có dung lượng lưu trữ vô hạn và thời gian vô hạn, thuật toán trên cuối cùng sẽ tìm ra một giải pháp tốt. Nhưng đó có lẽ không phải là ý của bạn khi nói "máy học".

Đây là một lợi thế: nếu bạn xem xét tất cả các vấn đề có thể xảy ra, trung bình không có thuật toán học máy nào có thể làm tốt hơn! Điều này được gọi là định lý không ăn trưa miễn phí . Nó chứng minh rằng trong số tất cả các vấn đề có thể xảy ra với bất kỳ thuật toán học máy cụ thể nào, con số mà nó có thể giải quyết nhanh chóng là rất nhỏ.

Nó có thể giải quyết những vấn đề đó một cách nhanh chóng chỉ vì chúng bị chi phối bởi các mẫu mà thuật toán có thể lường trước. Ví dụ, nhiều thuật toán thành công giả định như sau:

  1. Các giải pháp có thể được mô tả bằng một số phép nhân ma trận phức tạp và biến dạng phi tuyến, được điều chỉnh bởi một tập các tham số.

  2. Các giải pháp tốt sẽ được nhóm lại với nhau trong không gian tham số, để tất cả những gì bạn phải làm là chọn vùng lân cận tìm kiếm, tìm giải pháp tốt nhất ở đó, chuyển vùng lân cận tìm kiếm của bạn sao cho giải pháp tốt nhất nằm ở trung tâm và lặp lại.

Rõ ràng cả hai giả định này đều không nói chung. Thứ hai là đặc biệt nghi ngờ. Và bữa trưa miễn phí cho chúng ta biết rằng những giả định này thậm chí không giữ được phần lớn thời gian. Trong thực tế, họ gần như không bao giờ giữ! Đó chỉ là may mắn của chúng tôi khi họ nắm giữ một số vấn đề thực sự quan trọng.

Vấn đề bạn đã chọn được thiết kế ngay từ đầu để vi phạm giả định 2. Các hàm băm được thiết kế riêng để các đầu vào tương tự cho đầu ra hoàn toàn khác nhau.

Vì vậy, câu hỏi của bạn là thuật toán học máy tốt nhất để giải quyết vấn đề này là gì?


Tôi tự hỏi làm thế nào điện toán lượng tử sẽ ảnh hưởng đến định lý không ăn trưa miễn phí. Có lẽ, máy tính lượng tử cũng bị hạn chế bởi nó.
Max Vernon

1
@MaxVernon ồ, thú vị. Tôi hy vọng rằng tất cả các thuật toán lượng tử có cùng tính chất khi so sánh với các thuật toán lượng tử khác . Tôi không biết liệu tất cả các thuật toán tối ưu hóa lượng tử có tăng tốc trường hợp trung bình so với các thuật toán cổ điển hay không. Họ có thể! Tôi có một câu hỏi và tự trả lời rằng nói về một định lý "bữa trưa miễn phí" có thể có liên quan. (tldr; bữa trưa chỉ miễn phí nếu bạn bỏ qua một số công việc đã hoàn thành ... nhưng tôi tự hỏi liệu điều đó có thay đổi trong trường hợp lượng tử không.)
gửi

5

Nó là không thể. Tuy nhiên, mọi người đã quan sát một số mẫu trong SHA256 có thể gợi ý tính không ngẫu nhiên của nó Một bộ phân biệt cho SHA256 bằng Bitcoin (khai thác nhanh hơn trên đường đi) . Tldr của họ:

"Để phân biệt giữa hàm băm hoán vị ngẫu nhiên lý tưởng và SHA256, hãy băm một lượng lớn (~ 2 ^ 80) khối ứng viên 1024 bit hai lần, như được thực hiện trong Bitcoin. Đảm bảo rằng các bit của khối ứng viên được đặt rải rác (ít hơn nhiều so với Theo giao thức Bitcoin có nghĩa là 512), loại bỏ các khối ứng viên không đáp ứng tiêu chuẩn Bitcoin Khó gặp khó khăn (trong đó băm kết quả bắt đầu với số lượng lớn là 0). Với bộ ứng viên đầu vào hợp lệ còn lại (467369 khi phân tích này đã được thực hiện), quan sát một tập hợp cụ thể gồm 32 bit trong khối đầu vào (nằm ở nơi Bitcoin có nonce, bit đầu vào 607-639). Lưu ý rằng số bit trung bình được đặt trong trường nonce bị lệch sang trái, tức là nhỏ hơn giá trị mong đợi của 16 bit được đặt (trung bình ước tính 15.428). "

Xem một cuộc thảo luận về lobste.rs . Một lời giải thích có thể là một sự thiên vị được giới thiệu bởi các thợ mỏ.


2
Hay đấy. Nhưng trả lời trên lobste.rs có lẽ đúng. Đó là một thiên vị lớn, dễ dàng khám phá. Khái niệm rằng nó đã không được chú ý trong thời gian dài này là khá xa vời.
gửi

1
@senderle Để khai thác sai lệch (nếu có), người ta phải đưa ra một thuật toán (về cơ bản là thuật toán ML / tối ưu hóa) có giá trị tính toán sao cho chi phí hoạt động của chính nó khi được triển khai / đo lường trên phần cứng hiện đại được bù bởi sự tăng tốc mà nó cung cấp. Dự đoán rất thô thiển của tôi sẽ là yếu tố về #hashtrials phải lớn hơn gấp 10 lần để đánh bại lực lượng vũ phu và việc triển khai siêu tối ưu hóa của nó. Các hệ lụy có thể rất nghiêm trọng, đặc biệt đối với những người đặt cược vào tiền điện tử và các giao thức bảo mật.
IndieSolver

4

Tôi sẽ trả lời với một chương trình. Để giảm yêu cầu tính toán, tôi sẽ sử dụng một biến thể của sha256, tôi gọi sha16, đây chỉ là 16 bit đầu tiên của sha256.

#!/usr/bin/python3

import hashlib
from itertools import count

def sha16(plaintext):
    h = hashlib.sha256()
    h.update(plaintext)
    return h.hexdigest()[:4]

def has_plaintext_start_with_1(digest):
    """Return True if and only if the given digest can be generated from a
    plaintext starting with "1" first bit."""
    return True

def plaintext_starting_with_1(digest):
    """Return a plaintext starting with '1' matching the given digest."""
    for c in count():
        plaintext = (b'\x80' + str(c).encode('ascii'))
        d = sha16(plaintext)
        if d == digest:
            return plaintext

for digest in range(0x10000):
    digest = "%04x" % (digest,)
    plain = plaintext_starting_with_1(digest)
    print("%s hashes to %s" % (plain, digest))

Điều này tạo ra đầu ra:

b'\x8094207' hashes to 0000
b'\x8047770' hashes to 0001
b'\x8078597' hashes to 0002
b'\x8025129' hashes to 0003
b'\x8055307' hashes to 0004
b'\x80120019' hashes to 0005
b'\x8062700' hashes to 0006
b'\x8036411' hashes to 0007
b'\x80135953' hashes to 0008
b'\x8044091' hashes to 0009
b'\x808968' hashes to 000a
b'\x8039318' hashes to 000b
[...]

Tôi sẽ để lại bằng chứng đầy đủ như một bài tập cho người đọc, nhưng hãy chú ý đến nó: có một đầu vào bắt đầu bằng "1" cho mỗi thông báo có thể có từ 0000 đến ffff.

Ngoài ra còn có một đầu vào không bắt đầu bằng "1". Và có một cái bắt đầu với các tác phẩm hoàn chỉnh của Shakespeare, quá.

Điều này giữ cho bất kỳ chức năng băm hợp lý tốt, mặc dù bằng chứng vũ lực của tôi có thể trở nên không thể tính toán được.


Trong toán học, tôi không muốn nhận lời của bạn cho nó . Chương trình của bạn chứng minh rằng chức năng sha16 của bạn là so sánh, nhưng không có gì hơn. Bạn đã không đưa ra bằng chứng chính thức rằng chương trình này có thể chứng minh chức năng SHA-256 thực tế. Theo kiểu kết luận của bạn, phỏng đoán Collatz sẽ được giải quyết vì nó đã được giải quyết trong 32 bit và chương trình có thể dễ dàng chạy lâu hơn.
Roland Illig

4

Những gì bạn mô tả về cơ bản là một cuộc tấn công trước hình ảnh. Bạn đang cố gắng tìm một đầu vào sao cho khi được băm, đầu ra có một số thuộc tính như "số 1 dẫn đầu". *

Đó là một mục tiêu rõ ràng của băm mật mã để ngăn chặn các cuộc tấn công tiền hình ảnh như vậy. Nếu bạn có thể thực hiện một cuộc tấn công như vậy, chúng tôi có xu hướng coi thuật toán đó là không an toàn và ngừng sử dụng nó.

Vì vậy, trong khi điều đó có nghĩa là không phải là không thể, điều đó có nghĩa là thuật toán học máy của bạn sẽ phải vượt qua một phần lớn các nhà toán học trên thế giới và siêu máy tính của họ. Không chắc là bạn sẽ làm như vậy.

Tuy nhiên, nếu bạn đã làm, bạn sẽ được biết đến như một người đã phá vỡ một thuật toán băm mật mã lớn. Sự nổi tiếng đó có giá trị gì đó!

* Về mặt kỹ thuật, "cuộc tấn công tiền tố đầu tiên" cố gắng tìm một kết quả khớp cho một hàm băm cụ thể. Tuy nhiên, để chỉ ra rằng thuật toán băm có khả năng chống tấn công trước, chúng thường cho thấy rằng bạn không thể tìm thấy bất kỳ thông tin có ý nghĩa nào về đầu vào từ hàm băm.


2

Hầu hết tất cả các câu trả lời ở đây đều cho bạn biết lý do tại sao bạn không thể làm điều này nhưng đây là câu trả lời trực tiếp cho:

Bất kể nếu đây là "Có thể", thuật toán nào sẽ là cách tiếp cận tốt nhất?

Giả sử đầu vào đủ lớn:

  1. Hãy đếm số lượng các ký tự hợp lệ.
  2. Lấy đối ứng của số từ bước 1.

Đó là xác suất mà chuỗi đầu vào bắt đầu bằng '1'. Bạn thậm chí không cần nhìn vào đầu vào. Nếu bạn có thể làm tốt hơn thế, điều đó có nghĩa là hàm băm rất bị hỏng. Bạn có thể tiết kiệm rất nhiều chu kỳ CPU bằng cách cố gắng đào tạo một thuật toán để chọn các số ngẫu nhiên.

Bạn có thể đào tạo một thuật toán và nó có thể đưa ra một câu trả lời khác vì quá nhiều. Đó là trừ khi có điều gì đó thực sự sai với thuật toán băm. Sử dụng thuật toán này sau đó sẽ sai thường xuyên hơn nếu bạn chỉ chọn một giá trị ngẫu nhiên.


1

Các hàm băm được thiết kế có mục đích rất khó để mô hình hóa, vì vậy (như đã chỉ ra) điều này có thể sẽ rất khó khăn. Tuy nhiên, bất kỳ điểm yếu nào trong chức năng băm sẽ làm giảm entropy của nó, làm cho nó dễ dự đoán hơn.

Bất kể nếu đây là "Có thể", thuật toán nào sẽ là cách tiếp cận tốt nhất?

Một ví dụ hữu ích là Hàm vật lý không thể phát hiện được , hoặc PUF - tương tự như hàm băm phần cứng. Thông thường, các biến thể sản xuất được sử dụng một cách có chủ đích để cung cấp cho mỗi PUF một phản ứng hơi khác nhau để đầu ra 'băm' của chúng khác nhau cho một đầu vào nhất định. Tuy nhiên, các điểm yếu về thiết kế đã hạn chế entropy và được cung cấp đủ các cặp phản ứng thách thức, người ta thường có thể xây dựng mô hình hộp đen của PUF để có thể dự đoán được phản ứng cho một thách thức mới, chưa từng thấy trước đây.

Hồi quy logistic là cách tiếp cận được sử dụng phổ biến nhất cho các cuộc tấn công mô hình hóa này, như trong bài viết này của Rührmair .

Các thuật toán di truyền (hay nói chung là các chiến lược tiến hóa) có thể là một cách tiếp cận khác, vì chúng có thể áp dụng cho các vấn đề không thể phân biệt và / hoặc phân tách tuyến tính. Họ cũng được thảo luận trong bài báo trên.


1

Hãy nói rằng văn bản gốc / đầu vào của bạn chính xác là một khối dài (512bits = 1block cho SHA256). Không gian đầu vào cho nó là và không gian băm là . Để đơn giản, hãy xem xét đầu vào đầu tiên. Bây giờ bạn huấn luyện một thuật toán học máy (Bất kỳ thuật toán nào bạn chọn), với tập huấn luyện có kích thước bằng cách băm mọi số từ đến (Việc này sẽ mất rất nhiều thời gian và rất lớn dung lượng để lưu trữ, nhưng hãy để nó sang một bên trong giây lát). Sau khi đào tạo qua một bộ đào tạo lớn như vậy, bạn sẽ mong đợi mô hình hoạt động chính xác nhưng không. Còn lại251222562256

26402641

2256264các cặp đầu vào-băm có thể được ánh xạ trongcách. Trong số nhiều cách sắp xếp đó, chỉ có một cách sắp xếp là SHA256 của chúng tôi.(2256264)!

Đặt (Tổng số ánh xạ) và (Số ánh xạ chính xác cho độ chính xác 90%) Có thể đạt được thậm chí Độ chính xác 90% với mô hình của chúng tôi sẽ là (xác suất ánh xạ chính xác) * (xác suất ( ) ánh xạ không chính xác) = S=(2256264)
C=90100S
CSC

(1S1S11S2...1S(C1))(SC1SCSC2SC1SC3SC2...12)=(SC1)!S!

Cắm các giá trị, xác suất mô hình của chúng tôi sẽ đạt được độ chính xác 90% là Lấy logarit và sử dụng xấp xỉ Sterling cho các giai thừa, xác suất là2-(2 263,9918466566 -2 260,6509677217 )2-10,1322237391*2 260,6509677217

=(110(2256264)1)!(2256264)!
2(2263.99184665662260.6509677217)
210.13222373912260.6509677217

Phew, đó là một con số rất nhỏ. Và đây là một sự đánh giá quá cao, vì chúng tôi chỉ xem xét các đầu vào đầu tiên thay vì tổng số . Xác suất thực sự sẽ vẫn thấp hơn. 2 51222562512


1

Vấn đề là "học máy" không thông minh. Nó chỉ cố gắng tìm các mẫu. Trong SHA-256, không có mẫu nào. Không có gì để tìm. Học máy không có bất kỳ cơ hội nào tốt hơn sức mạnh vũ phu.

Nếu bạn muốn bẻ khóa SHA-256 bằng máy tính, khả năng duy nhất là tạo ra trí thông minh thực sự và vì rất nhiều người thông minh đã không tìm ra cách tạo SHA-256, bạn cần tạo ra trí thông minh nhân tạo cao hơn rất nhiều so với của nhiều người thông minh. Vào thời điểm đó, chúng ta không biết liệu một trí thông minh siêu nhân như vậy có thể bẻ khóa SHA-256 hay không, chứng minh rằng nó không thể bị bẻ khóa, hoặc sẽ quyết định rằng nó không đủ thông minh để làm (giống như con người). Khả năng sở hữu thứ tư dĩ nhiên là một trí thông minh nhân tạo siêu phàm như vậy thậm chí sẽ không bận tâm mà nghĩ về những vấn đề quan trọng hơn (đối với nó).

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.