2018-2-26 09:38
来源: 云心区块链
七、比特币转账——签名认证:hash算法
关于比特币的转账的问(wèn)题,我(wǒ)们(men)先前(qián)已经说过,但很粗略(luè),尤其是在签名(míng)认证这个点上,几乎是一嘴带(dài)过,现在好好说(shuō)一说。
比特币是如(rú)何转账的呢?我们(men)还是以(yǐ)Alice向(xiàng)Bob转账5个btc为例,Alice需要声明一下她要转账的这(zhè)笔(bǐ)钱是哪来的,比特币(bì)其(qí)实没有余额(é)的概念、只是一堆(duī)交(jiāo)易记录,首(shǒu)要需要(yào)声明要转账的五个btc是哪里来的、是谁转给(gěi)你的。那里Alice可以胡乱声明吗?不行,因为(wéi)她所(suǒ)声(shēng)明的这些交易记录(lù)都会(huì)被(bèi)检验,系统会自(zì)动对(duì)之进行(háng)核对(duì),一旦发现有冲突就会拒绝这个声(shēng)明。假(jiǎ)设这5个btc分别来(lái)自两笔交易,张三转(zhuǎn)账2btc给Alice,李(lǐ)四转账3btc给Alice。然(rán)后Alice要写明,我将这5个(gè)btc转(zhuǎn)账给Bob。交易其(qí)实就(jiù)算完成了。但是(shì)其它节点要对这个交易做两点验(yàn)证:其(qí)一、这条信息(xī)是否Alice是所发,其二、Alice所声明的交易(yì)记录是否为真。后者比(bǐ)较(jiào)容易,就是系统的自动核对。但前者如(rú)何(hé)进行?
现在就是要好好讲讲:如何验证(zhèng)信(xìn)息是否为(wéi)Alice本人所发的。不妨想想(xiǎng)生活中我们使用信(xìn)用卡也需要签名来确认是否为本人所使用一样(yàng),这里(lǐ)需要(yào)的是数字签名。具体流程(chéng)是结合(hé)了(le)第一集(jí)提(tí)到的的非(fēi)对称(chēng)加密(mì)和(hé)hash算法的。
这个(gè)hash算法(fǎ)是只能(néng)验(yàn)证不能求解,什么意思?我们举个简单的例子,体(tǐ)会一下(xià)hash算法的精神;比如根号17202这个数的后几位小数是(shì)9291430,系统只发送9291430这(zhè)个数,有没有(yǒu)可能(néng)猜(cāi)到是哪个数的开平方后(hòu)的后几位(wèi)小数(shù)呢?这就太难(nán)了。但也有办(bàn)法,那就是(shì)穷(qióng)举法,一个数(shù)一个数去(qù)尝试,说个最(zuì)笨的(de)方式,你就从1开(kāi)始尝试(shì),最后终于尝试到了(le)17202,惊(jīng)喜地发现(xiàn),这位仁兄、的开根(gēn)号、的后(hòu)几位、就是9291430,然后你就很激动地告(gào)诉大家:这个数就是17202。大家一算果(guǒ)然是,你好牛啊,你是花魁(kuí)啊!
咋(zǎ)样,这就(jiù)是hash算法,它的(de)加密规则是公(gōng)开(kāi)的(de),就是将原(yuán)本的数字开根号取(qǔ)后几(jǐ)位小数(shù),但你很难靠这几位小(xiǎo)数推测出来原本的数字,唯一的(de)方案就是(shì)暴力破解、穷举法,最终可以将原本的数(shù)字验证出来,这就叫hash算法(fǎ)。注意(yì),刚(gāng)才(cái)只是说的(de)一个简单(dān)的例子,真正的hash肯定是很(hěn)harsh的,是很复杂的,但都是这个气质。
现在我们把hash算法这个过程抽象为(wéi)h,我们要加密(mì)的信息记(jì)为(wéi)M1,则(zé)hash值(zhí)为h(M1)。我们知道hash值是不能反推出(chū)来的,而且也不(bú)存在说另外一条(tiáo)信(xìn)息M2,使得h(M2)=h(M1)。
Alice向Bob转账这个过(guò)程中(zhōng),Alice要需要(yào)发送(sòng)两(liǎng)部分内容:一是援引的之前的交易记录,二是此(cǐ)番Alice要(yào)向Bob转账的交易记录,此(cǐ)两者构成了Alice要向(xiàng)Bob发送的整体信息(xī),我(wǒ)们将之记做M1,可以(yǐ)想象这些信息都(dōu)已经数字化了,即便Alice和Bob这两个人也是以公钥或者说是地址来代(dài)替的,双方都是匿名的(de)嘛;我们只是为了表达方(fāng)便,才直接说成Alice和Bob,其实是Alice用她(tā)这个(gè)地址(zhǐ)给Bob的那个地(dì)址转账。
如果Alice只发送(sòng)这个整体信息M1,别人怎么确定就是Alice发送的呢?这一切必须(xū)要(yào)获得比(bǐ)特(tè)币世界所有人的认可(kě)啊(ā)。所以Alice在发送M1之前,还要(yào)对之签名。怎(zěn)么(me)签?签什(shí)么?那就是Alice要对整体信息(xī)M1 hash一下(xià),你就可以简单(dān)地认为、对M1进行(háng)了开根号,然后(hòu)得到最后(hòu)三位是(shì)369,也就是h(M1)=369。然后我们以第(dì)一集所(suǒ)讲的91×11为例,Alice私钥(yào)为11,公钥为(wéi)91。那么Alice就会把这个(gè)h(M1),也就是(shì)369乘上11的后三位(wèi)059,连同信息(xī)本身发(fā)送出(chū)去。这就是Alice完成了数(shù)字签名。
Alice周(zhōu)围各个(gè)节点收到信(xìn)息以后呢?首先(xiān)使用Alice的公(gōng)钥也就是91对这个059进行解密,也就是059×91=5369,取后三位还原出(chū)信(xìn)息为369。然后再对(duì)Alice发(fā)送(sòng)的原文信(xìn)息M1进行hash,发现结果也为369,这不(bú)就验(yàn)证成功了吗?这信息的确是Alice所发送(sòng)的。
再略微展开一下,这(zhè)里使用(yòng)了(le)跟Alice私钥配对的公(gōng)钥,因为只(zhī)有配对的公(gōng)钥私(sī)钥(yào)才能解密,所以这个(gè)解密(mì)成功(gōng)表明(míng)了确实是Alice发送的信息;其次,对Alice发送的原文进(jìn)行了hash计算,发现也是(shì)369,也说明了Alice发送的信息没有被别人(rén)篡(cuàn)改。所以这(zhè)些从哪里(lǐ)转来的又转(zhuǎn)到哪里去的(de)信息确确(què)实实(shí)是Alice发送的(de),然(rán)后大(dà)家再核对这些交易记(jì)录跟已有的账(zhàng)本是否冲突;如果(guǒ)不冲突,我们就(jiù)确认(rèn)了这条交(jiāo)易记录。即Alice的地址(zhǐ)向Bob地址(zhǐ)转(zhuǎn)账(zhàng)5btc这个记录有效。等到Bob想要(yào)花掉这5个(gè)btc时候(hòu),他就需(xū)要援引这条交易记录,同时对内容进行hash,再用(yòng)这个(gè)公钥地址配对的私钥进行签(qiān)名,同时发送(sòng)信息(xī),周(zhōu)而复始,妙不可言。中本聪,你是大葱(cōng)中最聪明的那(nà)根葱(cōng)。
现在我要(yào)把(bǎ)刚才的(de)验证过程再简单(dān)地梳理一下:ALICE在发送整体信息M1之前,先(xiān)对M1进行了hash,发现结果是369,于是用私钥(yào)处理了369,也(yě)就是乘以11,将后三位059连同信息本身发送出(chū)去(qù)。这就是Alice完成了(le)数字签(qiān)名。Alice周围各个节点(diǎn)收(shōu)到信息以后,先用Alice的公钥也就是91对(duì)这个059进行(háng)解密,即就是059×91=5369. 又发现将Alice原文(wén)信息M1进行hash,发现(xiàn)结果也是369,从而确认这天信息的确是ALICE发送的。你(nǐ)们说(shuō)妙不妙,众妙(miào)之门,此(cǐ)门最妙。