区块链论坛,区块链社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 80|回复: 0

monero门罗币stealthaddress匿名地址算法浅解:(1)Diffie-Hellman密...

[复制链接]

36

主题

37

帖子

142

积分

超级版主

Rank: 8Rank: 8

积分
142
发表于 2018-6-28 10:59:44 | 显示全部楼层 |阅读模式
门罗币(monero)是一种着重隐私保护的加密货币。相对于其他主流加密货币,它具有以下功能:
  • 即使拿到全部交易数据,第三方也无法解析收款人是谁——Stealth Address算法
  • 即使拿到全部交易数据,第三方也无法解析付款人是谁——Ring Signatures算法
  • 即使拿到全部交易数据,第三方也无法解析付款金额——RingCT算法
  • 参与交易的人的ip地址不可见——kovri技术(还未开发完成)
本文既不讨论挖矿,也不讨论算法证明。目标是从没有密码学背景的程序员的角度来理解这些算法的实现。
就先讲讲Stealth address,这一部分内容来自:CryptoNote v2.0 White Paper: https://cryptonote.org/whitepaper.pdf
Monero使用的是Ed25519加密算法,是一种基于ECC椭圆线的算法。然而这个算法太不intuitive,它的前身Diffie–Hellman key exchange要好懂得多。所以我们就先说说Diffie–Hellman key exchange。
该算法的定义:https://baike.baidu.com/item/Diffie-Hellman/9827194?fromtitle=Diffie–Hellman&fromid=6611182&fr=aladdin百度有很好的解释,我就不累述了。
举个例子:比如我在银行里排队开账户,掏出手机给老婆打了一个电话:
我:“老婆啊,新账户账户密设神吗啊?”老婆:“银行里人多耳杂,为了保密我们用Diffie–Hellman key exchange吧,我选两个数,p=23,和g=5“我:"好。"老婆:“我们各自在心里再想一个数,不要告诉对方”。我:“好。”老婆:“假设我的数是a,那么5amod 23等于4。”我:”假设我的数是b,那么5b5mod 23等于10。“老婆:”密码就设成10amod 23。“我:”好,就设成4bmod 23。“
事实上,老婆选的数是4,我选的数是3.我们选的密码是18。如果我们选别的数,那么就会得出另一个账户密码。但无论如何我们得出的密码是相等的。因为以下等式恒成立:
而其他人即使听到我们全部的谈话内容并知道这个算法,也很难算出这个密码是什么。我和老婆也不需要知道对方选的数是什么。在s和p选的足够大的时候,这个密码用现在的计算机算力是不可暴力破解的。
设我老婆选的数是a,称之为私钥。她给我的数A=ga是称之为公钥。设我选的数是b,称之为私钥。我给老婆的数B=gb是称之为公钥。设f(x, y)是上述定义的求次方取模操作。
则有f(A,b) = f(B,a)。
ECC椭圆线虽然比这个要复杂,它只是破解难度更高而已,所利用的原理始终都是 f(A,b) = f(B,a)。搞懂了这个,读懂monero加密算法就不难。

ECC椭圆线是二维坐标符合里符合一定条件的一个函数曲线,
我们定义,线上任意两点可以进行相加操作,具体是,过这两点的连线相交于曲线上第三点,第三点对x轴的镜像即为两点之和。如下图所示,R=P+Q
既然有加法,当然可以有乘法。一个点x2,即等于从它自己做函数曲线的切线,交与函数点的镜像。我们既然能算出2P,那么当然也能算出3P, 4P, 5P…
这条曲线有如下性质:
选取公开的基点G
比如张三秘密选取了整数a,计算aG,到达了点A,并把A公开出来,那么,根据公开的信息A和G以及函数曲线本身,别人是无法算出a是多少的。同时,假李四选了秘密整数b,计算bG,到达B,并把B公开出来,那么同样别人也无法逆推整数b。
然而,如果张三计算aB,李四计算bA,确可以确保到达同一点。
既 f(A, b) = f (B, a)
选用ECC只不过是因为它可以用更短的密码达到更高的安全性。它和Diffie–Hellman key exchange里面提到的指数函数作用是一样的。
CryptoNote2.0白皮书(https://cryptonote.org/whitepaper.pdf)对stealth address算法的描述如下:
有了前面的知识做铺垫,这个描述就很容易懂了。我再把上述公式用简单的语言翻译一下。
第一步:Bob选取两个数,a和b用来作为私钥。并在ECC椭圆曲线(monero用的是代号为Ed25519的这条曲线)上计算出对应的公钥A=aG和B=bG。G是曲线上一个公用的基点。Bob把这两个公钥对全网公布。
第二步:Alice选取随机整数r作为另一个私钥,计算:P=Hs(rA)G+B。这里解释一下,Hs是一个哈希函数。当马工的都用过哈希表,对这个不陌生。哈希函数保证了相同的输入总能得到相同的输出,然而从输出却不能反推输入。一个哈希函数的例子就是SHA-256
有的人不理解了,哈希函数的输入应该是一个数,而根据ECC算法,rA是一个点,怎么作为哈希函数输入呢?你把x坐标y坐标拼在一起它不就是个数了吗?反正经过哈希得到的结果是随机的。
Hs(rA)得到一个整数,用G做为基点走Hs(rA)步,得到某数,再加上B,得到P。
第三步:Alice计算R=rG。
第四步:Alice把转账记录,连同算好的P和R公布到区块链上。因为使用了哈希函数,根据这两个公开的数字,第三方无法逆推A和B是多少,既无法知道收款人是Bob。
第五步:Bob扫描区块链,计算P’=Hs(aR)G+B。如果这笔钱是给Bob的,那么因为Alice用的R=rA生成的R。根据ECC算法,有aR=rA。所以 P’=Hs(aR)G+B = Hs(rA)G+B = P. 所以Bob就知道这笔钱是他自己的。r仍然是只有Alice知道的秘密,日后Alice可以通过公开r来证明自己付过这笔钱(因为采用了ring signatures和stealth address仅从区块链上无法查到付款人是Alice)。
第六步:Bob计算x=Hs(aR)+b,得到一个整数。因为有:xG = Hs(aR)G+bG = Hs(aR)G+B = P,这符合ECC算法的定义,x就是针对公钥P的密钥——这个密钥连给钱的Alice也无法推出。日后Bob就可以使用这个密钥来花这笔钱了。



上一篇:交易所以太坊代币的归集问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|区块链论坛  

GMT+8, 2018-10-20 16:16 , Processed in 0.291582 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表