我需要一个具有以下属性的安全(加密)哈希函数:
我能找到的大多数安全散列函数在设计时考虑了速度/内存效率,因此编码很复杂。
目前的候选人是Mash-1(或Mash-2): Handbook of applied cryptography. Google Books
感谢。
编辑: 到目前为止,谢谢大家的答案。请原谅我,如果以下是粗鲁的,我只想清楚。请相信我,我完成了我的作业并考虑了“标准”选项。我知道最简单的事情就是使用其中一种,但这不是我想要的。
我想回答的唯一问题是: 什么加密安全哈希算法可以用最少量的“可读”代码实现?
我已经发布了我能找到的最佳人选。任何关于更简单的建议或关于Mash-1/2的评论都会有所帮助。
答案 0 :(得分:4)
如果你想要一个安全的哈希函数来实际保护某些东西(比如,作为加密算法的一部分),你最好使用SHA-512的库实现(或者可能是RIPEMD-160或几个)其他)。
如果你想要它用于哈希密码,我会说像MASH这样的哈希函数适合抗蛮力(当与盐一起使用时)和彩虹表。我仍然不会使用它,除非我有严格的要求禁止或阻止我使用库文件 - 但听起来你可能只有那些。
如果你想要一些不太安全的东西,比如文件完整性检查,除非你明确关注恶意用户产生冲突,否则几乎所有事情都会发生。在这种情况下,根据你所保护的价值,我的范围从像MASH这样的简单到像SHA-512或RIPEMD-320这样更具抵抗力的东西。
答案 1 :(得分:2)
根据您的要求,我会查看SHA-3 finalists。
如果你有为加密实现的AES原语,你可以重用它来相对简单地实现几个功能。
否则,我想我会选择Daniel Bernstein的Cubehash。那个人看起来有一些你想要的“简单优雅”。
答案 2 :(得分:2)
根据布鲁斯施奈尔的“应用密码学”第18.12节: “可以在块链接模式下使用公钥加密算法作为单向散列函数。”
列出RSA(丢弃私钥)作为示例。安全性与RSA一样强大。
RSA加密步骤实现起来相当简单。特别是在具有任意大小整数的语言中。
这两个警告是: 1.比大多数(所有)其他安全散列函数慢得多。哪个对我好。 2.如果您将公钥硬编码到代码中,则全世界都必须相信您丢弃了私钥数据。或者创建自己的公共私钥。
我会尽快发布代码。
编辑:这是它。 30行。简单。安全。 编辑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)))
答案 3 :(得分:2)
如果您更喜欢简单性和教学价值而不是效率,那么VSH哈希函数可能是一种选择。它提出了强有力的论据,即VSH是一个抗冲突的哈希函数,尽管这个函数缺少其他哈希函数所具有的其他一些属性(例如伪随机性)。
答案 4 :(得分:1)
查看TrueCrypt source。它们实现了几个强哈希函数。只是标准警告,修改现有实现是不明智的,或者更糟糕的是,使用自己的实现。它几乎肯定会注入弱点。我意识到你不是在这里做的,而只是一个免责声明。 :)