草庐IT

密码学——变色龙哈希

archer_oneee 2023-06-07 原文

变色龙哈希介绍

一、使用场景

当前比特币、以太坊等主流数字货币都是不可修改的区块链,一旦不法分子将违法信息添加到区块链中那么该信息将被永远保持,因此该特性无法满足某些特定场景。因此需要设计一个可编辑的区块链,比特币系统依靠哈希函数抗碰撞性保证不可篡改,因此为满足可编辑特性要求需要使用变色龙哈希。下面介绍变色龙哈希,针对不同消息𝑚可以产生相同哈希,使得哈希值具有碰撞性

二、使用细节

2.1 符号介绍

  • ℎ:变色龙哈希输出的哈希值
  • 𝐻:常见的密码哈希函数,如SHA25

2.2 公私钥产生算法( 𝐊 𝐞 𝐲 𝐆 𝐞 𝐧 𝐊𝐞𝐲𝐆𝐞𝐧 KeyGen)

  • 选择一个有限循环群 𝐺 𝐺 G 𝑔 𝑔 g为该群生成元, 𝑞 𝑞 q为该群的阶, λ \lambda λ为安全参数表示𝑞比特长度;
  • 监管者选择私钥 𝑥 ∈ 𝑅 Z q ∗ 𝑥 \in_{𝑅}ℤ_{q}^{*} xRZq,计算公钥 𝑦 = 𝑔 𝑥 𝑦=𝑔^{𝑥} y=gx;

2.3 对消息 𝒎 𝒎 m哈希值 h h h计算

  • 选择 𝑟 , 𝑠 ∈ 𝑅 Z q ∗ 𝑟,𝑠 \in_{𝑅}ℤ_{q}^{*} r,sRZq
  • 计算 h = r + ( g s y H ( m ∣ ∣ r ) )   m o d   q h=r+(g^{s}y^{H(m||r)})\ mod\ q h=r+(gsyH(mr)) mod q
    • 其中 g s y H ( m ∣ ∣ r ) g^{s}y^{H(m||r)} gsyH(mr)需要先在 G G G中进行计算,然后再进行 m o d   q mod\ q mod q计算。

2.4 对消息 𝒎 ′ 𝒎^{'} m哈希值 h h h计算

  • 选择 u ∈ 𝑅 Z q ∗ u \in_{𝑅}ℤ_{q}^{*} uRZq;
  • 计算 r ′ = h − g u   m o d   q r^{'}=h-g^{u}\ mod\ q r=hgu mod q
    • 和之前类似, g u g^{u} gu需要先在 G G G中进行计算,然后再进行 m o d   q mod\ q mod q计算;
  • 根据等式 g u = g s ′ y H ( m ′ ∣ ∣ r ′ ) g^{u}=g^{s^{'}}y^{H(m^{'}||r^{'})} gu=gsyH(mr)计算 s ′ s^{'} s
    • s ′ = u − x ⋅ H ( m ′ ∣ ∣ r ′ ) s^{'}=u-x·H(m^{'}||r^{'}) s=uxH(mr)
  • 产生相同哈希值 h = r ′ + ( g s ′ y H ( m ′ ∣ ∣ r ′ ) )   m o d   q h=r^{'} + (g^{s^{'}}y^{H(m^{'}||r^{'})})\ mod\ q h=r+(gsyH(mr)) mod q

三、应用实例

在将变色龙哈希应用至可编辑区块链时仅需对将构造交易头部哈希转变为变色龙哈希即可。当对之前某个区块进行修改时,构造新型𝑟′、𝑠′使得原有区块头哈希值保持不变但区块内容发生改变。

有关密码学——变色龙哈希的更多相关文章

  1. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  2. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  3. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  4. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  5. ruby-on-rails - 使用作为方法的值在 ruby​​ 中搜索哈希 - 2

    我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod

  6. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  7. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

  8. ruby - 如何在 Ruby 中获取多维哈希中的键? - 2

    因此,对于普通哈希,您可以使用它来获取key:hash.keys如何获取如下所示的多维哈希的第二维键:{""=>{"first_name"=>"test","last_name"=>"test_l","username"=>"test_user","title"=>"SalesManager","office"=>"test","email"=>"test@test.com"}}每个项目都是唯一的。所以我想从上面得到的键是:first_name,last_name,username,title,officeandemail 最佳答案

  9. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

  10. arrays - Ruby:尝试在哈希数组上获取 Enumerator 时,nil:NilClass 的未定义方法 `[]' - 2

    我正在尝试循环哈希数组。当我到达获取枚举器开始循环的位置时,出现以下错误:undefinedmethod`[]'fornil:NilClass我的代码如下所示:defextraireAttributs(attributsParam)classeTrouvee=falsescanTrouve=falseownerOSTrouve=falseownerAppTrouve=falseresultat=Hash.new(0)attributs=Array(attributsParam)attributs.eachdo|attribut|#CRASHESHERE!!!typeAttribut=a

随机推荐