pybitcointools源碼分析之RFC6979

在分析源碼之前柱查,一定要先講講什么是RFC6979辨液。

比特幣的簽名機(jī)制是基于橢圓曲線算法。在橢圓曲線里面k值(用于簽名)是要嚴(yán)格保密的蝠筑,暴露k值就相當(dāng)于暴露私鑰狞膘。k值要保證兩點(diǎn):

  1. 保密
  2. 唯一

有人提出一種方式來產(chǎn)生k值,類似下面這樣的公式:

k = SHA256(d + HASH(m));

其中菱肖,d是私鑰客冈,m是消息,我們一般會對消息的HASH進(jìn)行簽名稳强,因此這里是HASH(m)。

有私鑰d和悦,就保證了“保密”退疫,再加上消息m,保證了“唯一”鸽素,這也是“確定性”的算法褒繁,只要SHA256是安全的,此算法就是安全的馍忽。

當(dāng)然真正的RFC6979比這個要復(fù)雜的多棒坏。

k在使用橢圓曲線簽名的參與過程

關(guān)于橢圓曲線算法的詳細(xì)信息請自行查閱

這里只簡要說明k在使用橢圓曲線簽名的參與過程。

簽名的步驟:

  1. 使用bits2int將H(m)變換成模q的整數(shù)
h = bits2int(H(m))mod q
  1. 產(chǎn)生一個隨機(jī)值q遭笋,稱為k坝冕。值不得為0;它在[1,q-1]范圍內(nèi)瓦呼。大多數(shù)
    在傳統(tǒng)的ECDSA中喂窟,通過在q-1范圍內(nèi)選擇一個隨機(jī)值作為k。
  1. k和其它關(guān)鍵參數(shù)計算值r(模q):

對于ECDSA(橢圓曲線):計算點(diǎn)kG;其X坐標(biāo)(a被定義為E的字段的成員)被轉(zhuǎn)換為一個整數(shù),其被減數(shù)為q磨澡,產(chǎn)生r碗啄。

如果r為零,則應(yīng)選擇一個新的k再次計算(這是一個完全不可能發(fā)生的事情)稳摄。

計算值s(模q):

s =(h + x * r)/ k mod q

(r稚字,s)即使是簽名。

RFC6979(確定性簽名算法)生產(chǎn)k的流程

首先我們定義:

    HMAC_K(V)

使用密鑰(key)K對數(shù)據(jù)V進(jìn)行HMAC算法厦酬。

給定輸入消息m胆描,應(yīng)用以下過程:

  1. 通過哈希函數(shù)H處理m,產(chǎn)生:
h1 = H(m)
V = 0x01 0x01 0x01 ... 0x01

V(以比特)的長度等于8 * ceil(hlen / 8)弃锐。例如袄友,如果H是SHA-256,則V被設(shè)置為值為1的32個八位字節(jié)的序列霹菊。

K = 0x00 0x00 0x00 ... 0x00

K的長度(以比特)等于8 * ceil(hlen / 8)剧蚣。

K = HMAC_K(V || 0x00 || int2octets(x)|| bits2octets(h1))

'||'表示連接。x是私鑰旋廷。

V = HMAC_K(V)
K = HMAC_K(V || 0x01 || int2octets(x)|| bits2octets(h1))
V = HMAC_K(V)
  1. 執(zhí)行以下流程鸠按,直到找到適當(dāng)?shù)闹祂:
  • 將T設(shè)置為空序列。 T的長度(以比特為單位)表示為tlen, 因此tlen = 0饶碘。

  • 當(dāng)tlen <qlen時目尖,請執(zhí)行以下操作:

V = HMAC_K(V)
T = T || V

  • 計算
k = bits2int(T)

如果k的值在[1,q-1]范圍內(nèi)扎运,那么k的生成就完了瑟曲。否則,計算:

K = HMAC_K(V || 0x00)
V = HMAC_K(V)

并循環(huán)(嘗試生成一個新的T豪治,等等)洞拨。

源碼分析

有了上面的理論支撐再來分析源碼就比較容易了。

i = 1
result_k = deterministic_generate_k(bin_sha256(str(i)), encode(i, 256, 32))
print result_k

bin_sha256()返回輸入數(shù)據(jù)的hash256的結(jié)果负拟,不過是python的byte格式的(也就是字符串在計算機(jī)的真正樣子)烦衣。比如這里的

bin_sha256('1')

#結(jié)果是:

b'\x6b\x86\xb2\x73\xff\x34\xfc\xe1\x9d\x6b\x80\x4e\xff\x5a\x3f\x57\x47\xad\xa4\xea\xa2\x2f\x1d\x49\xc0\x1e\x52\xdd\xb7\x87\x5b\x4b'

這里的結(jié)果作為消息的hash結(jié)果,也就是上面提到的h1掩浙。

encode(i, 256, 32)得到一個私鑰花吟。

下面進(jìn)入deterministic_generate_k里面看看,

def deterministic_generate_k(msghash, priv):
    v = b'\x01' * 32
    k = b'\x00' * 32

    priv = encode_privkey(priv, 'bin')

    msghash = encode(hash_to_int(msghash), 256, 32)

    k = hmac.new(k, v+b'\x00'+priv+msghash, hashlib.sha256).digest()
    v = hmac.new(k, v, hashlib.sha256).digest()
    k = hmac.new(k, v+b'\x01'+priv+msghash, hashlib.sha256).digest()
    v = hmac.new(k, v, hashlib.sha256).digest()
    return decode(hmac.new(k, v, hashlib.sha256).digest(), 256)
v = b'\x01' * 32
k = b'\x00' * 32

分別代表上面流程中的

V = 0x01 0x01 0x01 ... 0x01

K = 0x00 0x00 0x00 ... 0x00

encode(hash_to_int(msghash), 256, 32)對應(yīng)bits2octets(h1)厨姚。

接下來的5行衅澈,就是進(jìn)行上面的4~8的步驟。

參考

[1] http://www.8btc.com/rfc6979

[2] https://tools.ietf.org/html/rfc6979

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遣蚀,一起剝皮案震驚了整個濱河市矾麻,隨后出現(xiàn)的幾起案子纱耻,更是在濱河造成了極大的恐慌,老刑警劉巖险耀,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弄喘,死亡現(xiàn)場離奇詭異,居然都是意外死亡甩牺,警方通過查閱死者的電腦和手機(jī)蘑志,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贬派,“玉大人急但,你說我怎么就攤上這事「惴Γ” “怎么了波桩?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長请敦。 經(jīng)常有香客問我镐躲,道長,這世上最難降的妖魔是什么侍筛? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任萤皂,我火速辦了婚禮,結(jié)果婚禮上匣椰,老公的妹妹穿的比我還像新娘裆熙。我一直安慰自己,他們只是感情好禽笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布入录。 她就那樣靜靜地躺著,像睡著了一般佳镜。 火紅的嫁衣襯著肌膚如雪纷跛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天邀杏,我揣著相機(jī)與錄音,去河邊找鬼唬血。 笑死望蜡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拷恨。 我是一名探鬼主播脖律,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腕侄!你這毒婦竟也來了小泉?” 一聲冷哼從身側(cè)響起芦疏,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎微姊,沒想到半個月后酸茴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兢交,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年薪捍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配喳。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酪穿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晴裹,到底是詐尸還是另有隱情被济,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布涧团,位于F島的核電站只磷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏少欺。R本人自食惡果不足惜喳瓣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赞别。 院中可真熱鬧畏陕,春花似錦、人聲如沸仿滔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崎页。三九已至鞠绰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飒焦,已是汗流浹背蜈膨。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牺荠,地道東北人翁巍。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像休雌,于是被迫代替她去往敵國和親灶壶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容