제 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)))
출처
2009-08-03 21:11:54
z5h
솔직히 내가 일반적으로 알려진 알고리즘 외에 다른 것을 신뢰하지 않기 때문에 학습 연습으로 이것을 수행하고 있습니까? –
당신이 가지고있는 문제는 X가 약간 연구 된 암호 프리미티브 일 때 아무도 그들의 마음을 손에 넣고 "X가 안전하다"고 말할 의사가 없다는 것입니다. 이것은 "안전"이란 일반적으로 "상당한주의를 기울 였음에도 불구하고 아직 파손되지 않았 음"을 의미하기 때문입니다. – caf
보안 요구 사항을 명확히 밝힐 필요가 있습니다. 보안 트레이드 오프를 수행하는 가장 일반적인 해시 알고리즘 중 하나를 선택하지 않으면 알 수없는 약점이있을 가능성이 훨씬 높습니다. "보안"은 이진 값이 아닙니다. SHA-512는 구현하기에 너무 복잡하기 때문에 기꺼이 사용하지 않을 것입니다. 따라서 구현을 쉽게하기 위해 어느 정도 보안을 유지할 수 있는지 알아보십시오. Scheme의 50 줄에서 구현할 수있는 _most_ 보안 해시를 찾고 있습니까? 그 알고리즘이 말하면 10 년 안에 망가질 가능성이 있더라도? –