[TOC]
前言
原文地址:http://www.reibang.com/p/941de6013a64
作者:夢(mèng)幻艾斯
備注:歡迎轉(zhuǎn)載,請(qǐng)保留原文地址漾峡。
在學(xué)習(xí)BIP32協(xié)議的時(shí)候遇到了不少疑惑嚼蚀,為了以后自己回顧方便。現(xiàn)在把遇到的問題和自己的見解寫下來誉己。全文先將BIP32協(xié)議進(jìn)行翻譯然后進(jìn)行解讀戒职。解讀之前先簡(jiǎn)單介紹下這個(gè)協(xié)議。
簡(jiǎn)介
BIP32協(xié)議是一個(gè)密鑰生成協(xié)議舷暮。用戶可以通過一個(gè)隨機(jī)種子生成一個(gè)擴(kuò)展私鑰态罪,然后通過這個(gè)擴(kuò)展私鑰生成N多私鑰、公鑰對(duì)和N多子擴(kuò)展私鑰下面。這就解決了錢包存儲(chǔ)不方便的問題复颈。具體看協(xié)議中的動(dòng)機(jī)篇
協(xié)議解讀
以下內(nèi)容會(huì)對(duì)協(xié)議的重點(diǎn)內(nèi)容進(jìn)行翻譯并解讀,原文地址
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
====================== 翻譯并解讀 ================
摘要(Abstract)
該文件描述了分層確定性錢包(或“HD錢包”):可以部分或全部用不同系統(tǒng)共享的錢包沥割,每個(gè)錢幣具有或不具有花費(fèi)硬幣的能力耗啦。
該規(guī)范旨在為可在不同客戶端之間互換的確定性錢包設(shè)定標(biāo)準(zhǔn)。雖然這里描述的錢包有很多特點(diǎn)机杜,但并不是所有的支持客戶都需要帜讲。
該規(guī)范由兩部分組成。在第一部分中椒拗,介紹了用于從單個(gè)種子推導(dǎo)密鑰對(duì)的樹的系統(tǒng)似将。第二部分演示了如何在這樣的樹之上構(gòu)建錢包結(jié)構(gòu)。
注:這里寫下對(duì)非確定性錢包蚀苛、確定性錢包在验、分層確定性錢包的理解
- 非確定性錢包--一堆隨機(jī)生成的密鑰對(duì)的集合
- 確定性錢包--由一個(gè)種子生成的密鑰對(duì)的集合
- 分層確定性錢包--由一個(gè)種子生成擴(kuò)展密鑰(私鑰,鏈碼),擴(kuò)展密鑰可以生成多個(gè)密鑰對(duì)還可以生成多個(gè)字?jǐn)U展密鑰
協(xié)議要解決的問題(Motivation)
比特幣標(biāo)準(zhǔn)客戶端使用隨機(jī)生成的密鑰堵未。為了避免在每次交易之后對(duì)錢包進(jìn)行備份腋舌,(默認(rèn)情況下)客戶端將生成100個(gè)密鑰緩存在備用密鑰池中。這種錢包并不打算分享私鑰和在不同的系統(tǒng)使用渗蟹。(注:這句翻譯的有點(diǎn)虛块饺,請(qǐng)看原文)赞辩。它們支出使用錢包加密功能去隱藏它們的私鑰而不是共享密碼。(解讀:這種錢包備份的時(shí)候都是備份一個(gè)經(jīng)過加密的文件授艰,恢復(fù)的時(shí)候從加密文件中恢復(fù))辨嗽,但這些“中性”錢包也失去了生成公鑰的權(quán)力。(注:這條解決了非確定性錢包的問題)
確定性錢包不需要如此頻繁的備份想诅,而橢圓曲線數(shù)學(xué)允許在不泄露私鑰的情況下計(jì)算公鑰的方案召庞。這允許例如網(wǎng)上商店業(yè)務(wù)讓其網(wǎng)絡(luò)服務(wù)器為每個(gè)訂單或每個(gè)客戶生成新的地址(公共密鑰散列),而不會(huì)讓網(wǎng)絡(luò)服務(wù)器訪問相應(yīng)的私人密鑰(這是花費(fèi)收到的資金所需的)来破。
然而,確定性錢包通常由一對(duì)鑰匙對(duì)組成忘古。只有一個(gè)鏈條意味著分享錢包的時(shí)候被分享者可以獲得你錢包的所有控制權(quán)徘禁。但是有些時(shí)候我們只需要分享部分共鑰。在網(wǎng)上商店的例子中髓堪,網(wǎng)絡(luò)服務(wù)器不需要訪問商人錢包的所有公共密鑰; 僅限于那些用于接收客戶付款的地址送朱,而不是例如當(dāng)商家花錢時(shí)產(chǎn)生的更改地址。分層確定性錢包允許通過支持從單根生成的多個(gè)密鑰對(duì)鏈來實(shí)現(xiàn)此類選擇性共享干旁。(注:這條解決了確定性錢包的問題)
規(guī)范:重點(diǎn)公式推導(dǎo)
約定
在本文的其余部分中驶沼,我們將假設(shè)比特幣中使用的公鑰密碼術(shù),即使用由secp256k1(http://www.secg.org/sec2-v2.pdf)
定義的字段和曲線參數(shù)的橢圓曲線密碼術(shù)争群。以下變量是:
- 整數(shù)取模曲線的階(稱為n)回怜。
- 曲線上點(diǎn)的坐標(biāo)。
- 字節(jié)序列换薄。
(注:描述一條Fp上的橢圓曲線玉雾,常用到六個(gè)參量: T=(p,a,b,G,n,h)。詳情請(qǐng)看比特幣學(xué)習(xí)1--橢圓曲線算法)
兩個(gè)坐標(biāo)對(duì)的加法(+)定義為EC組操作的應(yīng)用轻要。連接(||)是將一個(gè)字節(jié)序列附加到另一個(gè)字節(jié)序列的操作复旬。
作為標(biāo)準(zhǔn)轉(zhuǎn)換函數(shù),我們假設(shè):
point(p):返回由整數(shù)p表示的secp256k1基點(diǎn)的EC點(diǎn)乘法(EC組操作的重復(fù)應(yīng)用)產(chǎn)生的坐標(biāo)對(duì)冲泥。
ser32(i):將32位無符號(hào)整數(shù)i序列化為4字節(jié)序列驹碍,大端存儲(chǔ)(計(jì)算機(jī)術(shù)語)。
ser256(p):將整數(shù)p序列化為32字節(jié)序列凡恍,大端存儲(chǔ)(計(jì)算機(jī)術(shù)語)志秃。
serP(P):使用SEC1的壓縮格式將坐標(biāo)對(duì)P=(x,y)串行化為字節(jié)序列:(0x02或0x03)|| ser256(x)咳焚,其中頭字節(jié)取決于省略的y坐標(biāo)的奇偶校驗(yàn)洽损。偶數(shù)為0x02,奇數(shù)為0x03
parse256(p):將32字節(jié)序列轉(zhuǎn)換為256位數(shù)革半,大端存儲(chǔ)(計(jì)算機(jī)術(shù)語)碑定。
擴(kuò)展密鑰(Extended keys)
在接下來的內(nèi)容中流码,我們將定義一個(gè)函數(shù),該函數(shù)從父key中派生出一些子key延刘。為了防止這些僅依賴于父key本身漫试,我們首先擴(kuò)展私鑰和公鑰以及額外的256位熵。這種擴(kuò)展稱為鏈碼碘赖。對(duì)于相應(yīng)的私鑰和公鑰鏈碼是相同的驾荣,并且由32個(gè)字節(jié)組成。
我們將擴(kuò)展的私鑰表示為(k普泡,c)播掷,其中k是普通私鑰,c是鏈碼撼班。一個(gè)擴(kuò)展的公鑰被表示為(K歧匈,c),其中K =point(k),c是鏈碼
每個(gè)擴(kuò)展密鑰有231個(gè)普通子密鑰和2 31個(gè)強(qiáng)化子密鑰砰嘁。每個(gè)這些子key都有一個(gè)索引件炉。正常的子key使用索引0到231 -1。硬化的子key使用索引231至232 -1矮湘。為了簡(jiǎn)化對(duì)硬化的密鑰索引的記號(hào)斟冕,數(shù)字iH表示i + 231。
子key推導(dǎo)方法
給定父擴(kuò)展密鑰和索引i缅阳,可以計(jì)算相應(yīng)的子擴(kuò)展密鑰磕蛇。這個(gè)算法依賴于父擴(kuò)展密鑰是私鑰擴(kuò)展還是公鑰擴(kuò)展,i是普通索引還是硬化索引(i >= 231)
父私鑰->子私鑰
函數(shù)CKDpriv((kpar券时,cpar)孤里,i)→(ki,ci)從父擴(kuò)展私鑰計(jì)算子擴(kuò)展私鑰:
- 檢查 i ≥ 231 (判斷這個(gè)子key是不是硬化子key).
- 如果是 (硬化子key): 推導(dǎo)公式為 I = HMAC-SHA512(Key = cpar, Data = 0x00 || ser256(kpar) || ser32(i)). (注意: 使用 0x00 填充私鑰使他的長(zhǎng)度達(dá)到 33 bytes.)
- 如果不是 (普通子key): 推導(dǎo)公式為 I = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i)).
- 將I分割成兩個(gè) 32-byte 序列, IL and IR.
- 得到的子私鑰 ki = parse256(IL) + kpar (mod n).
- 得到的鏈碼 ci = IR.
- 當(dāng) parse256(IL) ≥ n or ki = 0, 推導(dǎo)出來的子 key 是無效的, 并且我們應(yīng)該把索引i設(shè)成下一個(gè)值. (注意: 在2127中發(fā)生這種情況的概率小于1 .)
HMAC-SHA512 函數(shù)定義在 [http://tools.ietf.org/html/rfc4231 RFC 4231].
父公鑰->子公鑰
函數(shù) CKDpub((Kpar, cpar), i) → (Ki, ci) 從一個(gè)父擴(kuò)展公鑰計(jì)算出一個(gè)子擴(kuò)展公鑰. 僅適用于普通子key(索引i滿足0<= i <231)
- 檢查 i ≥ 231 (這個(gè)子key是否是硬化子key).
- 如果是 (硬化子key): 返回失敗
- 如果不是(普通子key): 推導(dǎo)公式為 I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)).
- 將I分割成兩個(gè) 32-byte 序列, IL and IR.
- 得到的子公鑰 Ki = point(parse256(IL)) + Kpar.
- 得到的鏈碼 ci = IR.
- 當(dāng) parse256(IL) ≥ n or Ki 是無窮遠(yuǎn)點(diǎn)時(shí), 推導(dǎo)出來的子key是無效的, 并且我們應(yīng)該把索引i設(shè)成下一個(gè)值.
父私鑰->子公鑰
定義:函數(shù) N((k, c)) → (K, c) 計(jì)算出一個(gè)擴(kuò)展私鑰對(duì)應(yīng)的擴(kuò)展公鑰 (作為中間版本橘洞,移除了簽名交易的功能).
- 返回的 K = point(k).
- 鏈碼 c 不變.
從父私鑰計(jì)算子公鑰的方法:
- N(CKDpriv((kpar, cpar), i)) (總是有效的).
- CKDpub(N(kpar, cpar), i) (僅對(duì)普通子key有效).
The fact that they are equivalent is what makes non-hardened keys useful (one can derive child public keys of a given parent key without knowing any private key), and also what distinguishes them from hardened keys. The reason for not always using non-hardened keys (which are more useful) is security; see further for more information.
在不知道父私鑰的情況下能從父公鑰推導(dǎo)出子公鑰捌袜,這就是非硬化keys有用之處,也是和硬化keys區(qū)別的地方炸枣。那為什么不總是用非硬化keys呢虏等?這涉及到安全問題,詳情請(qǐng)看后面的內(nèi)容。(注:這段翻譯有點(diǎn)虛适肠,附上原文)
父公鑰->子私鑰
不可能實(shí)現(xiàn)
============ 子key推導(dǎo)方法疑惑解讀 開始 ============
-
父公鑰->子公鑰推導(dǎo)過程中從父公鑰推導(dǎo)出子公鑰霍衫。我們知道每一個(gè)公鑰唯一對(duì)應(yīng)一個(gè)私鑰,那么子公鑰對(duì)應(yīng)的私鑰到底是什么呢侯养?(我剛看這個(gè)協(xié)議的時(shí)候這個(gè)問題困惑我很久)
先給出答案:父公鑰->子公鑰推導(dǎo)出的公鑰對(duì)應(yīng)的私鑰就是父私鑰->子私鑰中推導(dǎo)出來的私鑰敦跌。下面我們進(jìn)行公式證明。
-
父私鑰->子私鑰推導(dǎo)公式為 Ik = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i))
子私鑰 ki = parse256(IkL) + kpar (mod n).
-
父公鑰->子公鑰推導(dǎo)公式為 IK = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)).
子公鑰Ki = point(parse256(IKL)) + Kpar.
因?yàn)镵par = point(kpar),所以得出結(jié)論Ik等于IK
由公鑰推導(dǎo)公式K=kG=point(k),子私鑰乘以G得
kiG = parse256(IkL)G + kpar (mod n)*G
K=point(parse256(IkL)) + Kpar =point(parse256(IKL)) + Kpar
證明完畢
-
非硬化key父公鑰推導(dǎo)子公鑰的安全問題:
訪問擴(kuò)展公共鑰匙并不能得到訪問子私人密鑰的途徑柠傍。但是麸俘,因?yàn)閿U(kuò)展公共鑰匙包含有鏈碼,如果子私鑰被知道或者被泄漏的話惧笛,鏈碼就可以被用來衍生所有的其他子私鑰从媚。一個(gè)簡(jiǎn)單地泄露的私鑰以及一個(gè)母鏈碼,可以暴露所有的子密鑰患整。更糟糕的是拜效,子私鑰與母鏈碼可以用來推斷母私鑰。
解決辦法:為了避免了推到出主鑰匙各谚,主鑰匙所衍生的第一層級(jí)的子鑰匙最好使用強(qiáng)化衍生紧憾。
具體參考:《精通比特幣-第四章》
============ 子key推導(dǎo)方法疑惑解讀 結(jié)束 ============
key樹
下一步是級(jí)聯(lián)幾個(gè)CKD結(jié)構(gòu)來構(gòu)建一棵樹。我們從一個(gè)根開始昌渤,即主擴(kuò)展密鑰m稻励。通過評(píng)估CKDpriv(m,i)對(duì)于i的多個(gè)值愈涩,我們得到許多1級(jí)派生節(jié)點(diǎn)。由于這些節(jié)點(diǎn)都是擴(kuò)展密鑰加矛,CKDpriv也可以應(yīng)用于這些履婉。
為了縮短符號(hào),我們將寫成CKDpriv(CKDpriv(CKDpriv(m斟览,3 H)毁腿,2),5)為m / 3 H / 2/5 苛茂。等同于公鑰已烤,我們將CKDpub(CKDpub(CKDpub(M,3)妓羊,2)胯究,5)寫為M / 3/2/5。這導(dǎo)致以下身份:
- N(m/a/b/c) = N(m/a/b)/c = N(m/a)/b/c = N(m)/a/b/c = M/a/b/c.
- N(m/aH/b/c) = N(m/aH/b)/c = N(m/aH)/b/c.
但是 N(m/aH) 不能寫成 N(m)/aH, 因?yàn)楹笳呤遣豢赡軐?shí)現(xiàn)的 .從父公鑰->子公鑰算法中我們知道硬化子建是不能用公鑰推導(dǎo)子公鑰的
樹中的每個(gè)葉節(jié)點(diǎn)對(duì)應(yīng)一個(gè)實(shí)際的鍵躁绸,而內(nèi)部節(jié)點(diǎn)對(duì)應(yīng)于從它們下降的鍵的集合裕循。葉節(jié)點(diǎn)的鏈代碼被忽略,只有它們的嵌入私鑰或公鑰是相關(guān)的净刮。由于這種結(jié)構(gòu)剥哑,知道擴(kuò)展私鑰允許重建所有后裔私鑰和公鑰,并且知道擴(kuò)展公鑰允許重建所有后裔非加密公鑰淹父。
key標(biāo)識(shí)符
擴(kuò)展密鑰可以通過序列化ECDSA公鑰K的Hash160(SHA256之后的RIPEMD160)來識(shí)別株婴,忽略鏈碼。這與傳統(tǒng)比特幣地址中使用的數(shù)據(jù)完全一致暑认。不建議以base58格式表示這些數(shù)據(jù)困介,因?yàn)樗赡鼙唤忉尀橐环N地址(并且錢包軟件不需要接受對(duì)鏈?zhǔn)矫荑€本身的付款)大审。
標(biāo)識(shí)符的前32位稱為密鑰指紋。
序列化格式
擴(kuò)展公鑰逻翁、私鑰序列化格式如下
4字節(jié):版本字節(jié)(mainnet:0x0488B21E public饥努,0x0488ADE4 private; testnet:0x043587CF public,0x04358394 private)
1字節(jié):深度:主節(jié)點(diǎn)為0x00八回,級(jí)別1派生密鑰為0x01酷愧。
4字節(jié):父密鑰的指紋(如果主密鑰為0x00000000)
4字節(jié):子數(shù)字。這是對(duì)于i在xi = xpar / i中的ser32(i)缠诅,其中xi是鍵序列化溶浴。 (如果主密鑰為0x00000000)
32字節(jié):鏈碼
33字節(jié):公鑰或私鑰數(shù)據(jù)(公鑰的serP(K),私鑰的0x00 || ser256(k))
這78字節(jié)結(jié)構(gòu)可以像其他比特幣數(shù)據(jù)一樣使用Base58編碼管引,首先添加32位checksum(對(duì)這78字節(jié)數(shù)據(jù)進(jìn)行兩次SHA-256操作士败,然后取結(jié)果的前32位)然后進(jìn)行Base58編碼。最后得到一個(gè)長(zhǎng)度112的字符褥伴。由于不同情況下選擇的版本號(hào)不同谅将,Base58格式表示的擴(kuò)展密鑰會(huì)有以下規(guī)則。在主網(wǎng)上以"xprv" or "xpub"開頭重慢,測(cè)試網(wǎng)上以"tprv" or "tpub"開頭
請(qǐng)注意饥臂,父母的指紋只能作為檢測(cè)軟件中父母和孩子節(jié)點(diǎn)的快速方法,軟件必須愿意處理沖突似踱。在內(nèi)部隅熙,可以使用完整的160位標(biāo)識(shí)符。
導(dǎo)入序列化擴(kuò)展公鑰時(shí)核芽,實(shí)現(xiàn)必須驗(yàn)證公鑰數(shù)據(jù)中的X坐標(biāo)是否與曲線上的點(diǎn)相對(duì)應(yīng)囚戚。如果不是,則擴(kuò)展公鑰是無效的轧简。
主密鑰生成
可用擴(kuò)展密鑰對(duì)的總數(shù)大概是2512,但是生成的key長(zhǎng)度只有256位驰坊,而且還要去掉一半不安全的密鑰對(duì)。所以主密鑰不是直接生成的吉懊,而是從一個(gè)短種子生成庐橙。
- 選擇一個(gè)長(zhǎng)度(128 bits到512 bits,建議使用256 bits)從一個(gè)隨機(jī)數(shù)生成算法中生成一個(gè)種子序列S
- 計(jì)算 I = HMAC-SHA512(Key = "Bitcoin seed", Data = S)
- 將 I 分割成兩個(gè)32byte的序列, IL and IR.
- k = parse256(IL) 作為主密鑰, IR 作為主鏈碼.
當(dāng) IL is 0 or ≥n, 主密鑰無效.
規(guī)范:錢包結(jié)構(gòu)
前面的部分指定了關(guān)鍵樹和它們的節(jié)點(diǎn)借嗽。下一步是在這棵樹上施加一個(gè)錢包結(jié)構(gòu)态鳖。本節(jié)中定義的布局僅為默認(rèn)設(shè)置,盡管客戶被鼓勵(lì)為了兼容性而模仿它恶导,即使并非所有功能都受支持浆竭。
默認(rèn)的錢包布局
一個(gè)HD錢包由多個(gè)“賬號(hào)”構(gòu)成。賬號(hào)都有一個(gè)編碼,默認(rèn)賬戶account ("") 的編碼是0.如果客戶端不需要支持多個(gè)賬戶邦泄,那它們只需要使用默認(rèn)賬戶就可以了删窒。
每個(gè)賬戶都由兩個(gè)密鑰對(duì)組成:內(nèi)部和外部。外部鑰匙串用于生成新的公共地址顺囊,而內(nèi)部鑰匙串用于所有其他操作(更改地址俊卤,生成地址呀舔,...办斑,任何不需要傳送的任何內(nèi)容)增蹭。不支持分離鏈碼的客戶端應(yīng)該使用外部密鑰對(duì)來處理一切事情。
- m / iH / 0 / k對(duì)應(yīng)于從主m獲得的HDW的帳號(hào)i的外部鏈的第k個(gè)密鑰對(duì)午乓。
- m / iH / 1 / k對(duì)應(yīng)于從主m獲得的HDW的帳號(hào)i的內(nèi)部鏈的第k個(gè)密鑰對(duì)站宗。
用例
分享整個(gè)錢包:m
在兩個(gè)系統(tǒng)都需要花費(fèi)一個(gè)錢包的時(shí)候,它們之間需要分享主擴(kuò)展私鑰益愈。節(jié)點(diǎn)可以為外部鏈保留一組N個(gè)觀察keys梢灭,以監(jiān)視收到的付款。觀察內(nèi)部鏈的代價(jià)是非常小的蒸其,因?yàn)檫@里不需要費(fèi)用敏释。對(duì)于第一個(gè)未使用的帳戶的鏈條,可能會(huì)激活額外的預(yù)查 - 在使用時(shí)觸發(fā)創(chuàng)建新帳戶摸袁。請(qǐng)注意颂暇,帳戶的名稱仍需要手動(dòng)輸入,并且無法通過塊鏈進(jìn)行同步但惶。
審計(jì):N(m / *)
如果審計(jì)員需要完整訪問收款和付款的清單,則可以共享所有帳戶公用擴(kuò)展密鑰湿蛔。這將允許審計(jì)人員在所有賬戶中查看所有來自錢包的交易膀曾,但不是一個(gè)秘密密鑰。
查詢每個(gè)辦公室余額: m/iH
當(dāng)一個(gè)企業(yè)有幾個(gè)獨(dú)立的辦公室的時(shí)候阳啥,他們可以使用一個(gè)從主私鑰生成的錢包添谊。這將允許總部維持一個(gè)超級(jí)錢包,看到所有辦公室的所有交易察迟,甚至允許在辦公室之間移動(dòng)資金斩狱。
經(jīng)常性的企業(yè)對(duì)企業(yè)交易:N(m / iH / 0)
如果兩個(gè)商業(yè)伙伴經(jīng)常轉(zhuǎn)賬,那么可以將特定賬戶的外部鏈(M / ih / 0)的擴(kuò)展公鑰用作“超級(jí)地址”扎瓶,從而允許不能(容易)關(guān)聯(lián)的頻繁交易所踊,但無需為每次付款申請(qǐng)新地址。這種機(jī)制也可以被挖掘池操作員用作可變支付地址概荷。
不安全的收款人:N(m / iH/ 0)
當(dāng)使用不安全的網(wǎng)絡(luò)服務(wù)器來運(yùn)行電子商務(wù)網(wǎng)站時(shí)秕岛,它需要知道用于接收付款的公共地址。網(wǎng)絡(luò)服務(wù)器只需要知道單個(gè)賬戶外部鏈的公共擴(kuò)展密鑰。這意味著非法訪問網(wǎng)絡(luò)服務(wù)器的人最多可以看到所有收到的付款继薛,但無法竊取資金修壕,不會(huì)(平凡)能夠區(qū)分即將離任的交易,也無法看到其他網(wǎng)絡(luò)服務(wù)器收到的付款是幾個(gè)遏考。
兼容性
為了符合這個(gè)標(biāo)準(zhǔn)慈鸠,客戶必須至少能夠?qū)胍粋€(gè)擴(kuò)展的公鑰或私鑰,以便將其直接后代作為錢包密鑰來訪問灌具。本規(guī)范第二部分介紹的錢包結(jié)構(gòu)(主賬戶/賬戶/鏈/子鏈)只是建議性的青团,但建議用作簡(jiǎn)單兼容性的最小結(jié)構(gòu) - 即使沒有單獨(dú)的賬戶或內(nèi)部和外部鏈的區(qū)別。但是稽亏,對(duì)于特定的需求壶冒,實(shí)現(xiàn)可能會(huì)偏離它; 更復(fù)雜的應(yīng)用程序可能需要更復(fù)雜的樹結(jié)構(gòu)。
安全
除了EC公鑰密碼本身的安全:
- 給一個(gè)公鑰K,攻擊者找到匹配的私鑰最好的辦法就是解決EC的離散對(duì)數(shù)問題(大概需要進(jìn)行 2128 次操作).
該標(biāo)準(zhǔn)的預(yù)期安全屬性是:
- 給一個(gè)子擴(kuò)展私鑰 (ki,ci) 和一個(gè)索引i,攻擊者進(jìn)行暴力破解需要將HMAC-SHA512執(zhí)行2256 次
- 給任何一個(gè)數(shù)字 (2 ≤ N ≤ 232-1) 在 (索引, 擴(kuò)展私鑰) (ij,(kij,cij)), 不同的 ij's, determining 判斷他們是否從同一個(gè)父擴(kuò)展私鑰推導(dǎo)出來 (既存在一個(gè)私鑰擴(kuò)展 (kpar,cpar) 使得在范圍 (0..N-1) CKDpriv((kpar,cpar),ij)=(kij,cij)),
最好的辦法是進(jìn)行2256次HMAC-SHA512暴力計(jì)算
注意截歉,以下屬性不存在:
- 給一個(gè)擴(kuò)展父公鑰 (Kpar,cpar) 和一個(gè)子公鑰 (Ki), 很難找到索引 i.
- 給一個(gè)父擴(kuò)展公鑰 (Kpar,cpar) 和一個(gè)普通子私鑰 (ki), 很難找到父私鑰 kpar.