地址嫡意、交易、區(qū)塊劳曹、網(wǎng)絡(luò)是區(qū)塊鏈數(shù)據(jù)里面最基本最重要的概念奴愉。地址用來標(biāo)示一筆交易的支出方和接收方。所有的交易最終需要被記到統(tǒng)一的賬本——區(qū)塊鏈上铁孵,而這個(gè)賬本是通過區(qū)塊確認(rèn)并完成的锭硼。每一個(gè)新區(qū)塊,都會(huì)被打上時(shí)間戳蜕劝,最終生成依照時(shí)間前后排列并加以記錄檀头。每個(gè)獨(dú)立節(jié)點(diǎn)之間又通過比特幣網(wǎng)絡(luò)來建立聯(lián)系,這樣就為電子交易記錄建立了一個(gè)去中心化岖沛、分布式的時(shí)間戳服務(wù)器系統(tǒng)暑始。
很復(fù)雜,在這一節(jié)烫止,我們先講地址蒋荚。
1、公鑰密碼學(xué)
講到地址馆蠕,我們就不得不先說一說密碼學(xué)期升,作為保護(hù)信息傳輸安全的技術(shù)手段,密碼在人類社會(huì)中的應(yīng)用源遠(yuǎn)流長(zhǎng)互躬,凱撒密碼是古典密碼的典型代表播赁,它的基本思想是通過字符的代換來實(shí)現(xiàn)加解密。因此古典密碼的安全性主要依賴加密算法本身的安全性吼渡,如果算法泄露了容为,要加密的信息也就沒有秘密可言了。
如今密碼學(xué)相關(guān)技術(shù)已經(jīng)深入各個(gè)領(lǐng)域寺酪,它們的理論共識(shí)都遵循由奧古斯特?柯克霍夫在19世紀(jì)提出“柯克霍夫原則”—— 密碼系統(tǒng)應(yīng)該即使被所有人知道其運(yùn)作步驟坎背,仍然是安全的。即算法是公開的寄雀,唯一需要保護(hù)的是密鑰得滤。
1949年香農(nóng)發(fā)表了《保密系統(tǒng)的信息理論》,為對(duì)稱密碼系統(tǒng)建立了理論基礎(chǔ)盒犹,帶來了加密傳輸基于秘鑰安全而不是基于加密算法安全的理論和技術(shù)變革懂更。這是密碼學(xué)發(fā)展的里程碑眨业,標(biāo)志著現(xiàn)代密碼學(xué)時(shí)代的來臨。
公鑰密碼學(xué)興起之前沮协,對(duì)稱加密是主流的加密模式龄捡,人們基于秘鑰來對(duì)信息進(jìn)行加解密,通常情況下慷暂,密鑰越長(zhǎng)聘殖,代表著密文被破解的難度越大。由于加密算法和解密算法都是同一模式呜呐,只有一把密鑰保證加密數(shù)據(jù)的安全就斤,因此這種加密算法也叫做“對(duì)稱加密算法”悍募。對(duì)稱加密有一個(gè)最大弱點(diǎn):甲方必須把密鑰告訴乙方蘑辑,否則乙方無法解密。而保存和傳遞密鑰坠宴,就成了最頭疼的問題洋魂。
公鑰密碼學(xué)是現(xiàn)代密碼學(xué)最重要的進(jìn)展。公鑰密碼學(xué)可以在不直接傳遞密鑰的情況下喜鼓,完成密文的解密副砍。加密和解密可以使用不同的規(guī)則,只要這兩種規(guī)則之間存在某種對(duì)應(yīng)關(guān)系即可庄岖,系統(tǒng)的安全性既不依賴算法的保密豁翎,也不用直接傳遞密鑰∮绶蓿基于這種公鑰機(jī)制的思想心剥,開始出現(xiàn)了一系列非對(duì)稱加密算法。
1976年Whitfield Diffie & Martin Hellman首次提出了基于數(shù)學(xué)難題的公鑰密碼機(jī)制背桐,1978年RSA公鑰密碼機(jī)制的出現(xiàn)优烧,成為公鑰密碼的杰出代表并成為事實(shí)標(biāo)準(zhǔn),在密碼學(xué)史上創(chuàng)造了又一個(gè)新的里程碑链峭。90年代公鑰密碼學(xué)進(jìn)一步發(fā)展畦娄,基于橢圓曲線乘法、素?cái)?shù)冪等數(shù)學(xué)函數(shù)的公鑰算法誕生弊仪,使得數(shù)字密鑰和不可偽造的數(shù)字簽名成為可能熙卡。
數(shù)據(jù)簽名算法的核心在于證明數(shù)據(jù)的發(fā)送方是簽名者發(fā)出的、不可抵賴励饵,而不是待簽名數(shù)據(jù)的保密性驳癌。
下圖比較說明非對(duì)稱加密與對(duì)稱加密算法的區(qū)別:
非對(duì)稱加密需要兩個(gè)(一對(duì))密鑰:公開密鑰(publickey)和私有密鑰(privatekey),用公鑰對(duì)數(shù)據(jù)進(jìn)行加密后,只有對(duì)應(yīng)的私鑰才能解密;反之如果私鑰用于加密疮丛,則只有對(duì)應(yīng)的公鑰才能解密壹置。通信雙方無須交換密鑰就可以建立保密通信昌执。
公鑰算法用到的是私鑰與公鑰荣茫,他們和比特幣體系中常常說到的地址有什么關(guān)系丧慈?在比特幣系統(tǒng)中馍迄,私鑰由32字節(jié)的隨機(jī)數(shù)組成艳吠,通過私鑰可以算出公鑰麦备,公鑰經(jīng)過一系列哈希及編碼算法就得到了比特幣中的地址。所以地址其實(shí)是公鑰的另一種表現(xiàn)形式昭娩,可以理解為公鑰的摘要凛篙。
2、相關(guān)的加密算法
在私鑰栏渺、公鑰及地址的相關(guān)運(yùn)算中呛梆,用到了基于secp256k1橢圓曲線乘法的簽名算法、SHA-256磕诊、RIPEMD-160填物,和Base58編碼。
2.1橢圓曲線簽名算法
橢圓曲線在密碼學(xué)中的使用是在1985年由Neal Koblitz和Victor Miller分別獨(dú)立提出的霎终。它的主要優(yōu)勢(shì)是在某些情況下它比其他的算法(比如RSA)使用更小的密鑰但提供相當(dāng)?shù)幕蚋叩燃?jí)的安全性滞磺。
比特幣使用了基于secp256k1橢圓曲線數(shù)學(xué)的公鑰密碼學(xué)算法。它包含私鑰與公鑰莱褒,私鑰用于對(duì)交易進(jìn)行簽名击困,將簽名與原始數(shù)據(jù)發(fā)送給整個(gè)比特幣網(wǎng)絡(luò),公鑰則用于整個(gè)網(wǎng)絡(luò)中的節(jié)點(diǎn)對(duì)交易有效性進(jìn)行驗(yàn)證广凸。簽名算法保證了交易是由擁有對(duì)應(yīng)私鑰的人所發(fā)出的阅茶。
2.2 哈希函數(shù)
SHA-256是一種哈希函數(shù),已經(jīng)在上一節(jié)的講解中做了介紹炮障,這里不再贅述[1]目派。
RIPEMD-160也是在生成地址時(shí)用到的一種哈希函數(shù),其輸出長(zhǎng)度為20字節(jié)(160位)胁赢。比特幣用它減少標(biāo)識(shí)接收方的字節(jié)數(shù)企蹭。
2.3 Base58編碼
可讀性編碼算法,類似古典密碼學(xué)里的置換算法智末,理論上并不是密碼學(xué)理論的核心內(nèi)容谅摄。可讀性編碼算法不是為了保護(hù)數(shù)據(jù)的安全性系馆,而是為了可讀性送漠。以二進(jìn)制進(jìn)行傳輸?shù)男畔⑹遣痪邆淇勺x性的,數(shù)字與字母組成的字符串才更容易被識(shí)別由蘑∶龉眩可讀性編碼不改變信息內(nèi)容代兵,只改變信息內(nèi)容的表現(xiàn)形式(部分編碼算法還加入了容錯(cuò)校驗(yàn)功能,以保證傳輸過程中數(shù)據(jù)的準(zhǔn)確性和完整性)爷狈。
Base64是常見的可讀性編碼算法植影,所謂Base64,即是說在編碼過程中使用了64種字符:大寫A到Z涎永、小寫a到z思币、數(shù)字0到9、“+”和“/”羡微。
Base58是Bitcoin中使用的一種編碼方式谷饿,主要用于產(chǎn)生Bitcoin的錢包地址。相比Base64妈倔,Base58不使用數(shù)字"0"博投,字母大寫"O",字母大寫"I"启涯,和字母小寫"i"贬堵,以及"+"和"/"符號(hào)。
設(shè)計(jì)Base58主要的目的是:
避免混淆结洼。在某些字體下,數(shù)字0和字母大寫O叉跛,以及字母大寫I和字母小寫l會(huì)非常相似松忍。
不使用"+"和"/"的原因是,非字母或數(shù)字的字符串難以作為賬號(hào)的一部分被接受筷厘。
沒有標(biāo)點(diǎn)符號(hào)鸣峭,通常不會(huì)被從中間分行。
使大部分的軟件支持雙擊選擇整個(gè)字符串酥艳。
比特幣中使用Base58算法來對(duì)公鑰的Hash160及私鑰進(jìn)行編碼摊溶,以生成以1或3開頭的比特幣地址及WIF(Wallet import Format)格式的私鑰。
3充石、私鑰與公鑰
比特幣私鑰其實(shí)是使用SHA-256生成的32字節(jié)(256位)的隨機(jī)數(shù)莫换,有效私鑰的范圍則取決于比特幣使用的secp256k1 橢圓曲線數(shù)字簽名標(biāo)準(zhǔn)。大小介于0x1 到0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140之間的數(shù)幾乎都是合法的私鑰骤铃。
在私鑰的前面加上版本號(hào)拉岁,后面添加壓縮標(biāo)志和附加校驗(yàn)碼,(所謂附加校驗(yàn)碼惰爬,就是對(duì)私鑰經(jīng)過2次SHA-256運(yùn)算喊暖,取兩次哈希結(jié)果的前四字節(jié)),然后再對(duì)其進(jìn)行Base58編碼撕瞧,就可以得到我們常見的WIF(Wallet import Format)格式的私鑰陵叽。
私鑰經(jīng)過橢圓曲線乘法運(yùn)算狞尔,可以得到公鑰。公鑰是橢圓曲線上的點(diǎn)巩掺,并具有x和y坐標(biāo)沪么。公鑰有兩種形式:壓縮的與非壓縮的。早期比特幣均使用非壓縮公鑰锌半,現(xiàn)在大部分客戶端默認(rèn)使用壓縮公鑰禽车。
由于數(shù)學(xué)原理,從私鑰推算公鑰是可行的刊殉,從公鑰逆推私鑰是不可能的殉摔。
初識(shí)比特幣的人常有一種誤解,認(rèn)為比特幣公鑰就是地址记焊,這是不正確的逸月。從公鑰到地址還要經(jīng)過一些運(yùn)算。
4遍膜、地址的生成
橢圓曲線算法生成的公鑰信息比較長(zhǎng)碗硬,壓縮格式的有33字節(jié),非壓縮的則有65字節(jié)瓢颅。地址是為了減少接收方所需標(biāo)識(shí)的字節(jié)數(shù)恩尾。比特幣地址的生成步驟如下:
生成私鑰與公鑰
將公鑰通過SHA256哈希算法處理得到32字節(jié)的哈希值
后對(duì)得到的哈希值通過RIPEMD-160算法來得到20字節(jié)的哈希值 —— Hash160
把版本號(hào)[2]+Hash160組成的21字節(jié)數(shù)組進(jìn)行雙次SHA256哈希運(yùn)算,得到的哈希值的頭4個(gè)字節(jié)作為校驗(yàn)和挽懦,放置21字節(jié)數(shù)組的末尾翰意。
對(duì)組成25位數(shù)組進(jìn)行Base58編碼,就得到地址信柿。
下圖以非壓縮格式的65字節(jié)公鑰示意上述過程:
由于橢圓曲線乘法以及哈希函數(shù)的特性冀偶,我們可以從私鑰推導(dǎo)出公鑰,也可以從公鑰推導(dǎo)出地址渔嚷,而這個(gè)過程是不可逆的进鸠。也正因如此,在整個(gè)比特幣系統(tǒng)中形病,私鑰是最關(guān)鍵的部分客年。私鑰泄露也就意味著丟失了一切。
我們要花掉一個(gè)地址上的資產(chǎn)窒朋,需要構(gòu)造一筆交易搀罢,同時(shí)使用這個(gè)地址對(duì)應(yīng)的私鑰簽名。而如果我們要將資產(chǎn)轉(zhuǎn)移到某個(gè)地址上侥猩,只需要轉(zhuǎn)賬給他公開的地址就行了榔至。