기계 학습이 SHA256 해시를 디코딩 할 수 있습니까?


43

64 자 SHA256 해시가 있습니다.

해시를 생성하는 데 사용되는 평문이 1로 시작하는지 여부를 예측할 수있는 모델을 훈련시키고 싶습니다.

이것이 "가능한"인지에 관계없이, 어떤 알고리즘이 가장 좋은 방법입니까?

내 초기 생각 :

  • 1로 시작하는 큰 해시 샘플과 1로 시작하지 않는 큰 해시 샘플을 생성하십시오.
  • 해시의 64 자 각각을 일종의 감독되지 않은 로지스틱 회귀 모델의 매개 변수로 설정하십시오.
  • 모델이 옳고 그름 일 때 알려주면서 모델을 훈련시킵니다.
  • 평문이 1로 시작하는지 또는 충분히 높은 정확도로 (그리고 괜찮은 카파로) 시작하는지 예측할 수있는 모델을 만들 수 있기를 바랍니다.

22
참고 : 이것은 비트 코인 채굴에 의한 것 같습니다.
Clojure 대부분

55
“이것이 '가능한지'에 관계없이 시간 여행을 할 수있는 모델을 어떻게 훈련시킬 수 있을까요?”
Konrad Rudolph

13
@Joshua OP는 SHA-256 을 반전 시키려고합니다 . SHA-256보다 수천 배나 많은 단계가 필요한 경우에도 게시하도록하겠습니다. 솔루션이 논리의 패배를 위해 현실의 구조 내에서 버그를 거의 확실하게 악용하기 때문에 기존 솔루션도 중단됩니다.
Konrad Rudolph

15
모든 SHA256 해시는 "1"로 시작하는 문자열로 생성 할 수 있습니다.
Reactgular September

8
@cgTag 죄송 합니다만 잘못되었습니다. 입력은 출력을 제어하지만 그렇지 않으면 처음에는 기능이 아닙니다. 또한 무한한 목록이 있다고해서 그 중 하나가 1로 시작한다는 의미는 아닙니다. SE 주석에서 알려진 암호 추측을 증명하려고합니다. 참고 : 나는 또한 그것이 사실이라고 생각하지만 그것이 사실이라고 주장하는 것은 오도의 소지가 있습니다. 당신이 옳다면, 반드시 종이나 다른 참고 문헌이있을 것입니다.
Pedro A

답변:


98

이것은 실제로 통계 답변이 아니지만 다음과 같습니다.

아니요 . 해시에서 일반 텍스트의 첫 번째 문자를 확인할 수 없습니다. 지정된 해시에 대한 "일반 텍스트"와 같은 것이 없기 때문입니다.

SHA-256은 해싱 알고리즘입니다. 평문이 무엇이든간에 32 바이트 서명이 나오며 종종 64 자 16 진수 문자열로 표시됩니다. 가능한 64 문자 16 진수 문자열보다 훨씬 많은 일반 텍스트가 있습니다. 여러 다른 일반 텍스트에서 동일한 해시를 생성 할 수 있습니다. '1'이 아닌 첫 번째 문자가 주어진 해시를 생성하는 모든 일반 텍스트에서 균일하다고 믿을 이유가 없습니다.


21
이것은 지금까지 (내 의견으로는) 유일한 정답입니다. 다른 모든 답변은 해시를 뒤집는 법을 배우는 대신 해시 함수를 배우는 문제를 더 다루는 것 같습니다 (실제 질문). 그들은 모두 해시 가 주입 기능 이 아니라는 것을 무시하는 것처럼 보입니다 .
Luca Citi

7
첫 번째 문자가 하나 일 확률 을 예측할 수 없습니까? 일대일 부족은 통계 학습에서 드문 문제가 아닙니다.
Matthew Drury

16
@MatthewDrury SHA256은 주어진 해시에 대해 모든 입력을 동일하게 만들도록 설계되었으므로 주어진 해시에 대해 1부터 시작하여 무한히 많은 입력이있을 것 입니다. 따라서 확률을 추정하려면 대략적인 추정치가 대략 됩니다. 1256±ε
Konrad Rudolph

12
예, 동의합니다. 나는 단지 주입 성의 부족이 실제로 머신 러닝을 적용 할 때 구조적인 문제가 아니라는 점에 주목하고 싶었습니다.
Matthew Drury

6
@IMil 해시 함수라는 사실을 구체적으로 언급 한 이유는 해시 함수가 해당 정보를 공개 하지 못할 가능성 을 암시 하는 것이 아니라 "평문"과 같은 것이 없다는 진술에 동기를 부여 하기 위함 입니다. 물론, (나쁜) 해시 함수는 부분적으로 가역적 일 수 있으며이를 생성 할 전체 일반 텍스트 집합에 대해 명확하게 말해 줄 수 있지만 SHA-256을 믿을만한 이유는 없습니다.
Chris H

51

SHA256은 가능한 한 무작위로 설계되었으므로 1 접두사 일반 텍스트에서 온 해시와 그렇지 않은 해시를 분리 할 수 ​​없을 것입니다. 해당 정보를 제공하는 해시 문자열의 기능이 없어야합니다.


5
"아마도"와 "해야한다"-알고리즘이 말해 줄 것입니다. 언뜻보기에는 불가능한 것처럼 보이지만이 가설을 테스트하기 위해 어떤 알고리즘과 접근 방식을 알고 싶습니다.
John

24
+1 어떤 종류의 "감독되지 않는 로지스틱 회귀 모델"이 실제로 천문학적 수의 사례를 제공 할 수 없다면 추측하는 것보다 더 나을 수는 없습니다. 이 문제는 풍차에서 기울어지고 있습니다.
whuber

44
시도해 볼 수는 있지만 학습자는 의도적으로 존재하지 않도록 설계된 통계적 관계를 찾으려고합니다.
Pavel Komarov

32
"가능한 한 무작위로 설계되었습니다"는 과소 평가입니다. 구체적으로,이 설계는 최대 비선형 의존성을 가지는데, 각 입력 비트는 출력 비트의 약 50 %에 영향을 미치며 각 출력 비트는 입력 비트의 약 50 %에 의존합니다. 이것을 혼란과 확산이라고 합니다. 전체 메시지를 복구하는 것만 큼 어려운 작업을 수행합니다 (첫 번째 비트 만 복구).
MSalters

12
나는 당신이이 대답에서 "아마도"강화할 수 있다고 생각합니다. OP는 통계 기반 기술을 적용하여 콘텐츠에서 SHA256 해시의 일부를 예측하거나 그 반대로 예측할 수있는 확률이 랜덤 추측보다 향상되었습니다. 실질적인 해결책은 기본적으로 원본 콘텐츠의 전체 대상 인구를 미리 계산하는 것입니다.
닐 슬레이터

43

이것이 "가능한"인지에 관계없이, 어떤 알고리즘이 가장 좋은 방법입니까?

미안하지만, 이것은 무의미한 질문입니다. 무언가가 불가능하면 문제에 대한 최선의 접근 방법을 검색 할 수 없습니다.

이 경우 해싱은 단방향 함수이기 때문에 이것은 불가능합니다. 실제로 여러 입력 (사실 무한)이 동일한 출력을 생성 할 수 있습니다. 입력의 첫 번째 비트 자체가 특정 해시 값의 확률에 영향을 미치는 경우 해시 알고리즘에 결함이 있음을 의미합니다.

신경망, 선형 분류기, SVM 및 예측 시도 대상을 확실히 훈련시킬 수 있습니다. 그리고 특정 해싱 알고리즘의 출력에서 ​​입력을 안정적으로 예측할 수 있으면이 알고리즘이 가치가 없음을 증명할 수 있습니다. SHA256과 같이 널리 사용되는 알고리즘의 경우 이러한 가능성이 거의 낮다고 말합니다. 그러나 검증되지 않은 새로운 해싱 알고리즘을 신속하게 배제하는 것이 합리적입니다.


6
sign(x)

11
@KonradRudolph : "일방 함수"는 이 문맥에서 여러분이 생각하고있는 의미가 아닌 특정한 의미를 갖 습니다. sign(x)사전 이미지를 찾는 것이 쉽지 않기 때문에 이러한 의미에서 단방향 기능은 아닙니다.
user2357112

4
즉, 대답이 "일방 함수"를 올바르게 사용하고 있다고 생각하지 않습니다.
user2357112

1
고마워, 난 몰랐어. 나는 그 의미를 의심 스럽지만 형용 할 수없는 함수로만 알고있었습니다. 그것은 또한 답변에 주어진 정의입니다.
Konrad Rudolph

1
그래, 미안, 나는 정의가 약간 느슨하다. 그러나 나는 '단방향'이 더 엄격한 용어보다 초보자에게 더 이해할 수 있다고 생각합니다.
IMil

26

예를 들어 부정적인 것을 증명할 수는 없습니다. 여전히 나는 모범이 암시 적이라고 생각한다. 아마도 유용 할 것입니다. 그리고 비슷한 문제를 어떻게 해결하려고하는지 보여줍니다.

의 경우 내가 바이너리 벡터 수있는 기능을 사용하여, 바이너리 예측을하고자 하는 임의의 숲 고체 선택입니다. 나는 이런 종류의 질문에 대한 두 번째 부분 인 좋은 알고리즘이 무엇인지 대답합니다.

각 비트가 통계적으로 독립적이므로 각 비트가 좋은 기능이므로 SHA256 문자열을 이진 (부울) 벡터로 사전 처리해야합니다. 입력을 256 요소의 부울 벡터로 만듭니다.

데모

다음은 Julia DecisionTree.jl 라이브러리를 사용하여 전체 작업을 수행하는 방법에 대한 데모입니다 .

아래를 복사하여 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)

결과

내가 이것을했을 때, 최대 10,000 개의 길이의 100,000 개의 임의 ASCII 문자열에 대한 훈련. 내가 본 결과는 다음과 같습니다.

모델 훈련

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

훈련 세트 정확도 :

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

테스트 세트 정확도 :

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

토론

기본적으로 아무것도 아닙니다. 우리는 훈련 세트에서 95 %에서 테스트 세트에서 거의 50 % 이상으로 갔다. 누군가가 귀무
가설을 기각 할 수 있는지 알아보기 위해 적절한 가설 검정을 적용 할 수는 있지만 우리가 할 수없는 것은 확실합니다. 추측 속도보다 약간 개선되었습니다.

그것은 배울 수 없다는 것을 암시합니다. 랜덤 포레스트라면, 잘 맞는 것에서 추측 속도 만 맞출 수 있습니다. 랜덤 포레스트는 어려운 입력을 배울 수 있습니다. 배워야 할 것이 있다면 적어도 몇 퍼센트는 기대할 것입니다.

코드를 변경하여 다른 해시 함수를 가지고 놀 수 있습니다. 흥미롭게도 julia는 내장 hash함수를 사용할 때 기본적으로 동일한 결과를 얻었습니다 (암호 적으로 안전한 hsah는 아니지만 여전히 좋은 해시이므로 비슷한 문자열을 따로 보내야합니다). 또한 기본적으로 동일한 결과를 얻었습니다 CRC32c.


15

해시 함수는 (설계 상) 기계 학습을 수행하는 데 매우 적합하지 않습니다.

ML은 기본적으로 로컬 연속 함수 를 모델링 / 추정하기위한 방법 모음입니다 . 즉, 특정 불연속성이있을 수는 있지만 대부분의 매개 변수 공간에서 매끄럽게 테스트 결과의 산란 된 샘플 데이터 만 다른 결과를 예측하는 데 사용할 수있는 실제 시스템을 설명하려고합니다. 입력. 이를 위해 AI 알고리즘은 데이터를 어떻게 든 영리한 기준으로 분해해야합니다. 예를 들어, 훈련에서 제안한 것과 같은 모양 (그러한 형태와 그러한 컨볼 루션의 결과와 관련이있는 것으로 보이면) 출력이 해당 영역 및 이와 같은 구조 (컨볼 루션 또는 무언가로 다시 설명 될 수 있음)에 있어야합니다.

(많은 ML 접근 방식은 컨볼 루션과 전혀 다르지만 일반적인 아이디어는 항상 동일합니다. 차원이 너무 높은 입력 공간이 있으므로 철저하게 샘플링 할 수 없으므로 외삽을 할 수있는 영리한 분해를 찾습니다. 비교적 드문 드문 샘플의 결과.)

암호 해시 함수 뒤에 아이디어 그러나 것입니다 어떤 평문에 변화가 발생한다 완전히 다른 다이제스트. 따라서 함수를 분해하는 방법에 관계없이 로컬 추정기는 해당 부분의 작은 변동이 결과에 어떤 영향을 미치는지 추정 할 수 없습니다. 물론 제한된 세트의 모든 정보 를 실제로 처리하지 않는 한 이것을 머신 러닝이라고 부르지는 않습니다. 단지 무지개 테이블을 만드는 것 입니다.


4
이 읽기,)를 사용하면 사용에 어떤 해시 함수를 알아야, 무지개 테이블을 구축하고, B)가 나에게 발생 수있는 충분히 큰 주어진 사용되는 알고리즘을 식별하는 알고리즘을 학습 기계 가능 입력 및 출력 샘플 (적어도 알고리즘에 식별 가능한 결함이있는 경우). 따라서 원래 문제가 식별해야 할 알 수없는 해시 함수에 관한 문제로 재조명 된 경우에는 실제로 더 흥미로울 수 있습니다.
senderle

7

이것은 "기계 학습"으로 간주되는 것에 대한 문제를 제기하기 때문에 흥미로운 질문입니다. 이 문제를 해결할 수 있다면 결국에는 이 문제를 해결할 알고리즘 이 있습니다. 다음과 같이 진행됩니다.

  1. 선호하는 프로그래밍 언어를 선택하고 모든 문자열을 (잠재적으로 큰) 정수로 매핑하는 인코딩을 결정하십시오.

  2. 난수를 골라 문자열로 변환합니다. 귀하의 언어로 유효한 프로그램인지 확인하십시오. 그렇지 않은 경우 다른 번호를 선택하고 다시 시도하십시오. 그렇다면 시작하고 즉시 일시 중지 한 다음 일시 중지 된 프로그램 목록에 추가하십시오.

  3. 일시 중지 된 모든 프로그램을 잠시 동안 실행하십시오. 적절한 솔루션을 생성하지 않고 중지 된 목록이 있으면 목록에서 제거하십시오. 적절한 솔루션을 생성하면 완료된 것입니다! 그렇지 않으면 모두 조금씩 실행 한 후 2로 돌아갑니다.

무한한 저장 시간과 무한 시간이 있다면 위의 알고리즘이 결국 좋은 해결책을 찾을 것이라는 데는 의문의 여지가 없습니다. 그러나 이것이 "머신 러닝"의 의미가 아닐 수도 있습니다.

문제는 다음과 같습니다. 가능한 모든 문제를 고려하면 평균적으로 더 나은 기계 학습 알고리즘을 사용할 수 없습니다! 이것은 무료 점심 정리 로 알려져 있습니다. 주어진 머신 러닝 알고리즘에서 발생할 수있는 모든 문제 중에서 신속하게 해결할 수있는 숫자가 거의 없다는 것을 증명합니다 .

알고리즘이 예상 할 수있는 패턴으로 관리되기 때문에 이러한 문제를 신속하게 해결할 수 있습니다. 예를 들어, 많은 성공적인 알고리즘은 다음을 가정합니다.

  1. 솔루션은 일련의 파라미터에 의해 제어되는 복잡한 일련의 행렬 곱셈과 비선형 왜곡으로 설명 할 수 있습니다.

  2. 좋은 솔루션은 매개 변수 공간에 함께 클러스터되므로 검색 환경을 선택하고 최상의 솔루션을 찾고 검색 환경을 이동하여 최상의 솔루션이 중앙에 오도록하고 반복하면됩니다.

분명히 이러한 가정 중 어느 것도 일반적으로 적용되지 않습니다. 두 번째는 특히 용의자입니다. 그리고 무료 점심은이 가정들이 대부분의 시간을 갖지 못한다는 것을 알려줍니다. 실제로 그들은 거의 잡지 못합니다! 그들이 실제로 문제가되는 특정 문제에 대해 보유하고있는 것은 우리의 행운입니다.

선택한 문제 는 처음부터 가정 2를 위반하도록 설계되었습니다. 해시 함수는 유사한 입력이 완전히 다른 출력을 제공하도록 특별히 설계되었습니다.

따라서 귀하의 질문 (이 문제를 해결하기위한 최고의 기계 학습 알고리즘은 무엇입니까?)은 아마도 무작위 검색이라는 매우 간단한 대답을 가지고있을 것입니다.


양자 컴퓨팅이 무 점심 점심 정리에 어떤 영향을 미치는지 궁금합니다. 아마도 양자 컴퓨팅도 이것에 의해 제약을받습니다.
Max Vernon

1
@MaxVernon 아, 흥미 롭습니다. 다른 양자 알고리즘 과 비교할 때 모든 양자 알고리즘이 동일한 속성을 가질 것으로 기대합니다 . 모든 양자 최적화 알고리즘이 전형적인 알고리즘보다 평균 속도가 빠른지 여부는 알 수 없습니다. 그들은 수도 있습니다! 나는이 질문 자체 대답 은 "공짜 점심"이론에 대한 회담이 관련 될 수 있다고합니다. (tldr; 수행 한 작업 중 일부를 무시한 경우에만 점심 식사는 무료이지만 ... 양자 사건에 변화가 있는지 궁금합니다.)
senderle

5

불가능한 옆에 있습니다. 그러나 사람들은 SHA256에서 비트 코인을 사용하는 SHA256에 대한 비 랜덤 성 A 구분자를 제안 할 수있는 몇 가지 패턴을 관찰했습니다 . 그들의 tldr :

"이상적인 랜덤 순열 해시와 SHA256을 구별하려면 비트 코인에서와 같이 대량의 (~ 2 ^ 80) 후보 1024 비트 블록을 두 번 해시하십시오. 후보 블록의 비트가 희소하게 설정되어 있는지 확인하십시오. Bitcoin 프로토콜에 따르면 512 평균 예상)은 Bitcoin "난이도"표준을 충족하지 않는 후보 블록을 폐기합니다 (결과 해시는 많은 수의 0으로 시작). 유효한 입력 후보 세트가 남아있는 경우 (467369 이 분석을 수행했습니다), 입력 블록에서 특정 32 비트 세트를 관찰합니다 (Bitcoin에 nonce가있는 위치, 입력 비트 607-639). nonce 필드에 설정된 평균 비트 수가 왼쪽으로 기울어 짐을 유의하십시오. 즉, 16 비트 세트의 예상 값보다 작습니다 (예상 평균 15.428). "

lobste.rs에 대한 토론을 참조하십시오 . 가능한 설명 중 하나는 광부가 도입 한 편견입니다.


2
이건 재미 있네. 그러나 lobste.rs에 대한 답은 아마도 옳습니다. 그것은 쉽게 찾을 수있는 큰 편견입니다. 그것이 오랫동안 눈에 띄지 않았다는 개념은 꽤 널리 퍼져 있습니다.
senderle

1
@senderle 바이어스 (있는 경우)를 이용하려면 최신 하드웨어에서 구현 / 측정 할 때 자체 오버 헤드가 발생하도록 계산 비용이 저렴한 알고리즘 (실제로 ML / 최적화 알고리즘)이 필요합니다. 제공하는 속도 향상에 의해 보상됩니다. 매우 거친 추측은 #hashtrials 측면의 요소가 무차별 대입과 초 최적화 된 구현을 이기기 위해 10 배 이상이어야한다는 것입니다. 특히 암호화 및 보안 프로토콜에 베팅하는 사람들에게는 그 의미가 매우 심각 할 수 있습니다.
IndieSolver

4

나는 프로그램으로 대답 할 것이다. 계산 요구 사항을 줄이기 위해 sha256의 변형을 사용합니다. sha256은 sha256의 첫 16 비트에 불과합니다.

#!/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))

출력이 생성됩니다.

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
[...]

나는 전체 증거를 독자를위한 연습으로 남겨 두겠다. 그러나 내 말을 들어 보자. 0000에서 ffff까지 가능한 모든 다이제스트에 대해 "1"로 시작하는 입력이있다.

"1"로 시작하지 않는 입력도 있습니다. 셰익스피어의 전체 작품으로 시작하는 것도 있습니다.

내 무차별 대입 증명은 계산 상 불가능할 수 있지만 합리적으로 좋은 해시 함수를 유지합니다.


수학에서 나는 당신의 말을 좋아하지 않습니다 . 귀하의 프로그램은 sha16 기능이 의심 스럽지만 그 이상은 없음을 보여줍니다. 이 프로그램이 실제 SHA-256 기능을 증명할 수 있다는 공식적인 증거는 제공하지 않았습니다. 결론적으로 Collatz 추측 은 이미 32 비트로 해결되고 프로그램을 더 오래 실행할 수 있기 때문에 해결 될 것입니다.
Roland Illig

4

당신이 묘사하는 것은 기본적으로 사전 이미지 공격입니다. 해시 될 때 출력에 "선행 1"과 같은 속성이있는 입력을 찾으려고합니다. *

이러한 사전 이미지 공격을 방지하는 것은 암호화 해시 의 명백한 목표입니다. 그러한 공격을 할 수 있다면, 우리는 그 알고리즘이 안전하지 않은 것으로 간주하고 사용을 중단하는 경향이 있습니다.

그것은 불가능하지 않다는 것을 의미하지만, 머신 러닝 알고리즘은 세계의 많은 수학자와 슈퍼 컴퓨터를 동시에 능가해야합니다. 그렇게 할 것 같지 않습니다.

그러나 그렇게하면 주요 암호 해시 알고리즘을 위반 한 사람으로 알려지게됩니다. 그 명성은 가치가 있습니다!

* 기술적으로 "첫 번째 사전 이미지 공격"은 특정 해시와 일치하는 항목을 찾으려고합니다. 그러나 해시 알고리즘에 첫 번째 사전 이미지 공격 저항이 있음을 나타 내기 위해 일반적으로 해시의 입력에 대한 의미있는 정보를 찾을 수 없음을 나타냅니다.


2

여기에있는 모든 답변은 왜 당신이 이것을 할 수 없지만 당신에게 직접적인 대답입니다 :

이것이 "가능한"인지에 관계없이, 어떤 알고리즘이 가장 좋은 방법입니까?

입력이 충분히 크다고 가정합니다.

  1. 유효한 문자 세트의 수를 가져옵니다.
  2. 1 단계에서 역수를 구합니다.

입력 문자열이 '1'로 시작될 확률입니다. 입력 내용을 볼 필요조차 없습니다. 그보다 더 잘 할 수 있다면 해시가 매우 손상되었음을 의미합니다. 임의의 숫자를 선택하도록 알고리즘을 훈련시키는 것보다 많은 CPU주기를 절약 할 수 있습니다.

알고리즘을 훈련시킬 수 있으며 과적 합으로 인해 다른 답변이 나올 수 있습니다. 해시 알고리즘에 실제로 문제가없는 한 그렇지 않습니다. 이 알고리즘을 사용하면 단순히 임의의 값을 선택하는 것보다 더 자주 잘못됩니다.


1

해싱 함수는 의도적으로 모델링하기 어렵도록 설계되었으므로 (이미 지적한 바와 같이) 이는 매우 어려울 수 있습니다. 그럼에도 불구하고 해싱 함수에 약점이 있으면 엔트로피가 줄어들어 예측하기가 더 쉽습니다.

이것이 "가능한"인지에 관계없이, 어떤 알고리즘이 가장 좋은 방법입니까?

유용한 예는 하드웨어 해싱 함수와 유사한 물리적 복제 불가능 함수 ( PUF)입니다. 일반적으로, 제조 변형은 의도적으로 각 PUF에 약간 다른 응답을 제공하여 '해시'출력이 주어진 입력에 대해 달라 지도록 사용됩니다. 그러나 설계 약점은 엔트로피를 제한하고 충분한 챌린지-응답 쌍을 고려할 때 이전에 볼 수 없었던 새로운 챌린지에 대한 응답을 예측할 수 있도록 PUF의 블랙 박스 모델을 구축하는 것이 종종 가능합니다.

로지스틱 회귀 분석은 Rührmair 의이 백서에서와 같이 이러한 모델링 공격에 가장 일반적으로 사용되는 방법입니다 .

유전 적 알고리즘 (또는보다 일반적으로 진화론 적 전략)은 구별 및 / 또는 선형으로 분리 할 수없는 문제에 적용 할 수 있기 때문에 대안적인 접근법 일 수 있습니다. 그들은 또한 위의 논문에서 논의되었습니다.


1

251222562256

26402641

2256264(2256264)!

S=(2256264)
C=90100S
CSC

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

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

22562512


1

문제는 "기계 학습"이 지능적이지 않다는 것입니다. 패턴을 찾으려고합니다. SHA-256에는 패턴이 없습니다. 찾을 것이 없습니다. 기계 학습은 무차별 대입보다 나은 기회를 얻지 못했습니다.

컴퓨터로 SHA-256을 해독하려는 경우 유일한 가능성은 실제 지능 을 만드는 것입니다. 많은 영리한 인간이 SHA-256을 만드는 방법을 찾지 못했기 때문에 인공 지능을 훨씬 더 많이 만들어야합니다. 많은 영리한 인간의 것. 그 시점에서, 우리는 그러한 초 인간 지능이 SHA-256을 깨뜨 리거나, 그것이 깨질 수 없다는 것을 증명하거나, (사람처럼) 그렇게 할만 큼 영리하지 않다고 결정하는지 알 수 없습니다. 네 번째 가능성은 물론 그러한 초 인간 인공 지능이 더 중요한 문제에 대해 귀찮게하지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.