简单(代码)安全散列函数

时间:2009-08-02 22:54:21

标签: hash cryptography scheme

我需要一个具有以下属性的安全(加密)哈希函数:

  1. 可以在尽可能少的行中编码(在R5RS方案中)。希望低于50岁。
  2. 密码长度数据的内存和CPU性能。 (例如,它不必非常高效或为数百万字节的数据创建哈希)
  3. 我能找到的大多数安全散列函数在设计时考虑了速度/内存效率,因此编码很复杂。

    目前的候选人是Mash-1(或Mash-2): Handbook of applied cryptography. Google Books

    感谢。

    编辑: 到目前为止,谢谢大家的答案。请原谅我,如果以下是粗鲁的,我只想清楚。请相信我,我完成了我的作业并考虑了“标准”选项。我知道最简单的事情就是使用其中一种,但这不是我想要的。

    我想回答的唯一问题是: 什么加密安全哈希算法可以用最少量的“可读”代码实现?

    我已经发布了我能找到的最佳人选。任何关于更简单的建议或关于Mash-1/2的评论都会有所帮助。

5 个答案:

答案 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。它们实现了几个强哈希函数。只是标准警告,修改现有实现是不明智的,或者更糟糕的是,使用自己的实现。它几乎肯定会注入弱点。我意识到你不是在这里做的,而只是一个免责声明。 :)