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