2009-08-02 2 views
7

보안 해시 :간단한 (코드) 나는 다음과 같은 특성을 가진 보안 (암호화) 해시 함수 필요한 기능

  1. 이 (R5RS 계획에) 가능한 한 몇 줄의 코딩이 가능합니다. 희망에 따라 50 세 미만입니다.
  2. 암호와 길이가 다른 이유로 인해 성능이 저하 될 수 있습니다. (예 : 매우 효율적이거나 수백만 바이트의 데이터에 대해 해시를 생성 할 필요가 없음)

찾을 수있는 대부분의 보안 해시 함수는 속도/메모리 효율성을 염두에두고 설계되었으며 결과적으로 코드 작성이 복잡합니다. . Handbook of applied cryptography. Google Books

감사 :

현재 후보

은 매시-1 (또는 매시-2)입니다.

편집

: 지금까지 귀하의 답변에 대한 여러분 모두 감사합니다. 다음이 무례한 것으로 나온다면 저를 용서해주십시오. 나는 분명히하고 싶습니다. 숙제를 마치고 "표준"옵션을 고려했다는 것을 믿어주십시오. 내가 할 수있는 가장 쉬운 일은 그 중 하나를 사용하는 것이지만 그것이 내가 원하는 것만은 아니라는 것입니다.

내가 대답하려고하는 하나의 질문은 다음과 같습니다. "판독 가능한"코드의 최소량으로 암호화 된 보안 해시 알고리즘을 구현할 수 있습니까?

나는 이미 내가 찾은 최고의 후보자를 올렸습니다. Mash-1/2에 대한 간단한 설명이나 주석에 대한 제안이 가장 도움이 될 것입니다.

+3

솔직히 내가 일반적으로 알려진 알고리즘 외에 다른 것을 신뢰하지 않기 때문에 학습 연습으로 이것을 수행하고 있습니까? –

+0

당신이 가지고있는 문제는 X가 약간 연구 된 암호 프리미티브 일 때 아무도 그들의 마음을 손에 넣고 "X가 안전하다"고 말할 의사가 없다는 것입니다. 이것은 "안전"이란 일반적으로 "상당한주의를 기울 였음에도 불구하고 아직 파손되지 않았 음"을 의미하기 때문입니다. – caf

+0

보안 요구 사항을 명확히 밝힐 필요가 있습니다. 보안 트레이드 오프를 수행하는 가장 일반적인 해시 알고리즘 중 하나를 선택하지 않으면 알 수없는 약점이있을 가능성이 훨씬 높습니다. "보안"은 이진 값이 아닙니다. SHA-512는 구현하기에 너무 복잡하기 때문에 기꺼이 사용하지 않을 것입니다. 따라서 구현을 쉽게하기 위해 어느 정도 보안을 유지할 수 있는지 알아보십시오. Scheme의 50 줄에서 구현할 수있는 _most_ 보안 해시를 찾고 있습니까? 그 알고리즘이 말하면 10 년 안에 망가질 가능성이 있더라도? –

답변

2

다음 VSH 해시 함수는 옵션이 될 수 있습니다. VSH가 충돌 저항성 해시 함수라는 강력한 주장이 있지만,이 함수는 다른 해시 함수에있는 몇 가지 속성 (예 : 의사 난수)이 없습니다.

+0

이것은 내가 찾고 있었던 것 같습니다. 나는 종이를 훑어보고 당신의 대답을 받아 들였다. 감사합니다. – z5h

1

TrueCrypt source을 확인하십시오. 그들은 여러 가지 강력한 해시 함수를 구현합니다. 단지 표준 경고 일 뿐이며, 기존 구현을 수정하거나 더 나쁘게 만드는 것은 현명하지 않습니다. 그것은 거의 확실하게 약점을 주입 할 것입니다. 자네가 여기서 그걸하지 않는다는 걸 알지만 부인할 뿐이야. :)

4

실제로 암호화 알고리즘의 일부로 보안 해시 기능을 원할 경우 SHA-512 (또는 RIPEMD-160) 라이브러리 임 플리 멘 테이션을 사용하는 것이 가장 좋습니다 또는 다른 몇 가지). 당신이 암호를 해싱을 위해 그것을 원하는 경우

, 나는 MASH 같은 해시 함수는 짐승 (소금 사용) 힘과 무지개 테이블에 저항력이되는 법안에 딱 맞는 말할 것입니다. 나는 라이브러리 임 플리 멘 테이션을 사용하지 못하게하거나 금지시키지 않는 한 엄격한 요구 사항을 제외하고는 사용하지 않을 것이다. 당신이 덜 안전한 무언가를 원하는 경우

는, 파일 무결성하면 충돌을 생성하는 악의적 인 사용자에 대해 명시 적으로 우려하지 않는 한 거의 모든 것을 할 것입니다, 확인 말한다. 이 경우, 당신이 보호하고있는 가치에 따라, 나는 MASH와 같은 단순한 것에서 SHA-512 나 RIPEMD-320과 같은 더 강한 것까지 다양 할 것입니다.

2

요구 사항에 따라 SHA-3 finalists을 확인해 보겠습니다. 당신은 암호화에 구현 된 AES는 원시가있는 경우

, 당신은 비교적 간단하게 기능의 여러 구현하기 위해 다시 사용할 수 있습니다.

그렇지 않으면, 나는 다니엘 번스타인의 Cubehash와 함께 갈 것입니다 생각합니다. 저것은 당신이 찾고 있던 그 "단순한 우아함"중 일부를 가지고있는 것처럼 보입니다.

+0

감사합니다. 이것은 흥미로운 가능성처럼 보입니다. – z5h

2

제 18 항에 따르면.Bruce Schneier의 "Applied Cryptography": "단방향 해시 함수로 블록 연결 모드에서 공개 키 암호화 알고리즘을 사용할 수 있습니다."

RSA (개인 키가 삭제됨)가 예로서 나열됩니다. 보안은 RSA만큼 강력합니다.

RSA 암호화 단계는 구현하기가 매우 쉽습니다. 특히 임의의 크기의 정수를 가진 언어에서.

2 가지주의 사항은 다음과 같습니다. 1. 대부분의 (모든) 다른 보안 해시 기능보다 훨씬 느립니다. 어느 것이 나에게 좋다. 2. 공개 키를 코드에 하드 코딩 한 경우 세계는 사용자가 개인 키 데이터를 삭제했다고 신뢰할 수 있습니다. 또는 자체 공개 공개 키를 만듭니다.

나는 작업 예제를 작성하자 마자 코드를 게시합니다.

편집 : 여기 있습니다. 30 라인. 단순한. 안전한. EDIT 2 : 실제로 포함 된 것은 변형이며 작동하지 않을 수 있습니다. 이 게시물 아래의 주석을보고 업데이트를 확인하십시오. 당신이 효율성을 통해 단순하고 교육적 가치를 선호하는 경우

; compute a^d mod n 
(define powmod 
    (lambda (a d n) 
    (cond 
     ((= 0 d) 1) 
     ((= 1 d) (modulo a n)) 
     ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n)) 
     (else 
     (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n))))) 

(define foldr 
    (lambda (func end lst) 
    (if (null? lst) 
     end 
     (func (car lst) (foldr func end (cdr lst)))))) 

; something to turn a string into a number 
(define any-string->number 
    (lambda (s) 
    (foldr 
     (lambda (a b) (+ a (* 256 b))) 
     0 
     (map char->integer (string->list s))))) 

; some big primes 
(define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231) 
(define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453) 

; hash turns a string into a number 
; see discrete logarithms. the inverse of this is *hard* to compute 
; http://en.wikipedia.org/wiki/Discrete_logarithm 
(define hash 
    (lambda (s) 
    (powmod (any-string->number s) p q))) 
+2

나는 실제로 그것을 제안한다고 생각했지만 반대했다. 또 다른 단점은 출력이 상당히 클 수 있다는 것입니다. 1024 비트 모듈을 사용하는 경우 128 바이트입니다. 또한 입력을 블록으로 분할하고 결과를 체인화해야합니다 (또는 입력이 모듈러스보다 클 경우). –

+6

또한 구현 한 것은 RSA 또는 Diffie-Hellman이 아닙니다. 사실, 이것은 다소 사소한 것입니다. 주어진 (a^p mod q), p와 q를 찾는 것은 쉽습니다. 이산 대수 문제는 주어진 (p^a mod q), p와 q를 찾는 것입니다. –

+1

Rasmus에게 감사드립니다. 이 스레드에서 도움이되었습니다. RSA의 사용을 설명하는 "적용된 암호화"의 동일한 섹션에서이 방법을 언급합니다. 나는 지금 나와 함께 책을 가지고 있지 않지만, 나는 그 점을 상당히 확신하고있다. 나는 집에 도착하면 다시 확인해 볼 것입니다. 이것이 정확하게 이산 대수 문제가 아닌 방법을 알았습니다. 그러나 RSA에서 우리는 여전히 메시지^e mod n을 가지고있다. 여기서 n은 어떤 소수 p q에 대해 (p-1) (q-1)이고 e는 n에 대해 상대적으로 소수이다. 이것은 쉽게 파손될 수 있으므로 RSA가 가능할 것으로 보입니다. 이것을 깨뜨리는 알고리즘의 방향을 알려줄 수 있습니까? – z5h

관련 문제