Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 简单(编码)安全哈希函数_Hash_Cryptography_Scheme - Fatal编程技术网

Hash 简单(编码)安全哈希函数

Hash 简单(编码)安全哈希函数,hash,cryptography,scheme,Hash,Cryptography,Scheme,我需要具有以下属性的安全(加密)哈希函数: 可以用尽可能少的行编码(在R5RS方案中)。希望在50岁以下 内存和CPU性能符合密码长度数据的原因。(例如,它不必非常高效,也不必为数百万字节的数据创建哈希) 我能找到的大多数安全散列函数都是在考虑速度/内存效率的情况下设计的,因此编码起来很复杂 当前候选对象是Mash-1(或Mash-2): 谢谢 编辑: 谢谢大家迄今为止的回答。请原谅我,如果以下内容被认为是粗鲁的,我只是想澄清一下。请相信我,我已经完成了我的家庭作业,并考虑了“标准”选项。我知

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

  • 可以用尽可能少的行编码(在R5RS方案中)。希望在50岁以下
  • 内存和CPU性能符合密码长度数据的原因。(例如,它不必非常高效,也不必为数百万字节的数据创建哈希)
  • 我能找到的大多数安全散列函数都是在考虑速度/内存效率的情况下设计的,因此编码起来很复杂

    当前候选对象是Mash-1(或Mash-2):

    谢谢

    编辑: 谢谢大家迄今为止的回答。请原谅我,如果以下内容被认为是粗鲁的,我只是想澄清一下。请相信我,我已经完成了我的家庭作业,并考虑了“标准”选项。我知道最简单的方法就是使用其中一种,但这不是我想要的

    我想回答的一个问题是: 哪种加密安全的哈希算法可以用最少的“可读”代码实现


    我已经发布了我能找到的最好的候选人。任何关于更简单的东西的建议,或者关于Mash-1/2的评论都会非常有用。

    请查看。它们实现了几个强散列函数。只是标准警告,修改现有实现是不明智的,更糟糕的是,使用您自己的实现。它几乎肯定会注入弱点。我知道你不是在这里这么做,只是一个免责声明。:)

    如果您想要一个安全的散列函数来实际保护某些东西(比如,作为加密算法的一部分),最好使用SHA-512(或者RIPEMD-160或其他一些)的库实现

    如果你想用它来散列密码,我会说像MASH这样的散列函数适合抵抗暴力(与salt一起使用时)和rainbow表。我仍然不会使用它,除非我有严格的要求禁止或阻止我使用库实现——但听起来你可能有这些


    如果你想让它变得不那么安全,比如说文件完整性检查,除非你明确担心恶意用户产生冲突,否则几乎任何事情都可以做到。在这种情况下,根据您所保护的内容的价值,我会选择一些简单的东西,比如MASH,或者一些更具抵抗力的东西,比如SHA-512或RIPEMD-320。

    对于您的要求,我会查看

    如果为加密实现了AES原语,则可以重用该原语以相对简单地实现几个函数


    否则,我想我会选择丹尼尔·伯恩斯坦的。这一个看起来有一些你一直在寻找的“简单优雅”。

    根据Bruce Schneier的《应用密码学》第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)))
    

    如果您更喜欢简单性和教学价值而不是效率,那么哈希函数可能是一种选择。VSH是一个抗冲突的散列函数,尽管该函数缺少一些其他属性(例如伪随机性),但它有很强的论据其他哈希函数都有。

    你这样做只是为了学习,因为坦率地说,除了常见的算法之外,我不相信任何东西。你遇到的问题是,当X是一个很少研究的加密原语时,没有人愿意把手放在心上说“X是安全的”。这是因为“安全”通常意味着“尽管受到了极大的关注,但尚未被破坏”。您确实需要澄清您的安全要求:如果您不选择最常见的哈希算法之一,您正在执行安全权衡,因为它更有可能存在未知的弱点。“安全”不是二进制值。您不愿意使用SHA-512,因为它太复杂,无法实现。因此,请帮助我们了解为了更容易地实现,您愿意牺牲多少安全性。您只是在寻找可以在50行方案中实现的最安全的散列吗?即使这个算法可能在10年内被破坏,我也在整理一个网络堆栈,作为一个心理学工具。我不想省略任何必要的内容(密码散列),但我想确保一切尽可能简单,以便任何研究它的人都有希望完全理解每个组件。一些密码算法(RSA、Feistel密码)有某种简单的优雅,我希望在安全散列中也有类似的东西。我必须处理可用的内容,这个线程的目的是发现我的选项。scheme真的没有实现sha1吗?谢谢。这看起来是一个有趣的可能性。我实际上考虑过提出这个建议,但决定反对。另一个缺点是输出相当大:如果使用1024位模数,则为128字节。另外:请记住,您必须将输入分割成块并链接结果(如果输入大于模数,则失败)。此外:您实现的既不是RSA也不是Diffie Hellman。实际上,这是相当容易破碎的。寻找一个给定的(a)^