摘要:既然我們已經(jīng)可以產(chǎn)生橢圓曲線密鑰對(duì),我們接下來(lái)就用使用它來(lái)進(jìn)行消息的簽名和驗(yàn)證。簽名橢圓曲線簽名算法就是在中,各方必須約定一個(gè)共同的哈希函數(shù)因?yàn)槲覀儗⒁灻膶?duì)象是消息,而不是消息本身。這種行為也是造成交易可塑性的原因之一。
既然我們已經(jīng)可以產(chǎn)生橢圓曲線密鑰對(duì),我們接下來(lái)就用使用它來(lái)進(jìn)行消息的簽名和驗(yàn)證。我所指的消息是任何形式,無(wú)論是文本還是二進(jìn)制形式,只要它們有被驗(yàn)證合法性的需要。特別的是,bitcoin客戶端通過(guò)簽名來(lái)證明交易的有效性,反之,礦工則是通過(guò)驗(yàn)證這樣的簽名,來(lái)批準(zhǔn)并廣播合法的交易。
ECDSA 簽名橢圓曲線簽名算法就是ECDSA(Elliptic-Curve Digital Signature Algorithm).在ECDSA中,各方必須約定一個(gè)共同的哈希函數(shù)H, 因?yàn)槲覀儗⒁灻膶?duì)象是H(消息),而不是消息本身。值得注意的是,只有簽名方S有私鑰的權(quán)限,驗(yàn)證方V只需要拿到相應(yīng)的公鑰就可以進(jìn)行驗(yàn)證。本文中,我將使用上一章所創(chuàng)建的密鑰對(duì)。
下面的案例中,我們簽名的對(duì)象是SHA-256摘要。但bitcoin中指定的H函數(shù)是HASH256,也就是指雙重SHA-256。
簽名第一步把我們的消息存入文件,命名ex-message.txt。
This is a very confidential message
之后,我們用私鑰對(duì)其SHA-256摘要進(jìn)行簽名。
$ openssl dgst -sha256 -sign ec-priv.pem ex-message.txt >ex-signature.der
ex-signature.der文件是簽名的DER格式。OpenSSL使用DER編碼任何二進(jìn)制輸出,但這里我們忽略這個(gè)細(xì)節(jié)。你不需要了解ECDSA簽名的語(yǔ)法,只需要記住它僅僅是一組的大數(shù)對(duì)(r,s)。
你可能會(huì)注意到,每一次你執(zhí)行程序,簽名都發(fā)生變化,也就是說(shuō)默認(rèn)的簽名過(guò)程是不具有確定性的。這就給序列化區(qū)塊鏈交易時(shí)帶來(lái)了問(wèn)題,因?yàn)楹灻?b>交易字節(jié)序列中的一部分,并且你一定知道txid是對(duì)交易進(jìn)行哈希得來(lái)的。因此,每當(dāng)你簽名一筆交易,txid就會(huì)隨之變化。這種行為也是造成交易可塑性的原因之一。
為了顯示十六進(jìn)制編碼的簽名,只需添加-hex參數(shù)。
$ openssl dgst -sha256 -hex -sign ec-priv.pem ex-message.txt
為了重用剛剛輸出的結(jié)果,最好使用hexdup已生成的DER文件。
$ hexdump ex-signature.der驗(yàn)證
無(wú)論什么時(shí)候?qū)⒑戏ㄏl(fā)布到網(wǎng)絡(luò),接收者都希望能夠得到一個(gè)附件的簽名。在假設(shè)我們已經(jīng)得到作者公鑰的情況下,無(wú)論是原消息還是簽名,都必須作為驗(yàn)證流程的輸入數(shù)據(jù):
$ openssl dgst -sha256 -verify ec-pub.pem -signature ex-signature.der ex-message.txt代碼版本
我們使用代碼來(lái)完成上文中在命令行中完成的同樣的工作。
簽名OpenSSL使簽名流程變得簡(jiǎn)單,這一部分可以在 ex-ecdsa-sign.c中查看。
uint8_t priv_bytes[32] = { ... }; const char message[] = "This is a very confidential message "; EC_KEY *key; uint8_t digest[32]; ECDSA_SIG *signature; uint8_t *der, *der_copy; size_t der_len; ... key = bbp_ec_new_keypair(priv_bytes); bbp_sha256(digest, (uint8_t *)message, strlen(message)); signature = ECDSA_do_sign(digest, sizeof(digest), key);
ECDSA_SIG是一個(gè)簡(jiǎn)單的結(jié)構(gòu),用于存儲(chǔ)上文所說(shuō)的(r,s)對(duì):
struct { BIGNUM *r; BIGNUM *s; } ECDSA_SIG;
使用i2d_ECDSA_SIG函數(shù),我們也可以得到DER編碼的簽名:
der_len = ECDSA_size(key); der = calloc(der_len, sizeof(uint8_t)); der_copy = der; i2d_ECDSA_SIG(signature, &der_copy);驗(yàn)證
驗(yàn)證同樣很簡(jiǎn)單,可以在ex-ecdsa-verify.c中查看:
uint8_t pub_bytes[33] = { ... }; uint8_t der_bytes[] = { ... }; const char message[] = "This is a very confidential message "; EC_KEY *key; const uint8_t *der_bytes_copy; ECDSA_SIG *signature; uint8_t digest[32]; int verified; ... key = bbp_ec_new_pubkey(pub_bytes); der_bytes_copy = der_bytes; signature = d2i_ECDSA_SIG(NULL, &der_bytes_copy, sizeof(der_bytes));
因?yàn)闊o(wú)法得到私鑰,我們利用使用下面的輔助函數(shù)將pub_bytes解碼為壓縮形式。
EC_KEY *bbp_ec_new_pubkey(const uint8_t *pub_bytes, size_t pub_len);
另一方面,der_bytes是簽名程序返回的DER格式的簽名。我們將解碼DER簽名到更方便的ECDSA_SIG結(jié)構(gòu)中,然后與消息摘要比較進(jìn)行驗(yàn)證。
ECDSA_do_verify函數(shù)的返回值:
1,簽名合法
0,簽名不合法
-1,出現(xiàn)未知錯(cuò)誤
注意:使用ECDSA_verify可以跳過(guò)簽名的解碼過(guò)程,因?yàn)樗枰妮斎胫凳?b>DER形式的簽名。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23965.html
摘要:通過(guò)命令行中顯示結(jié)論壓縮形式占據(jù)一個(gè)或的前綴的坐標(biāo)從代碼中生成注原文作者的密鑰對(duì)的產(chǎn)生過(guò)程是冗長(zhǎng)的,然而使用來(lái)完成卻不難??梢允且粋€(gè)完整的密鑰對(duì)或者是一個(gè)單獨(dú)的公鑰。 bitcoin中的密鑰綜述 關(guān)于bitcon中使用的橢圓曲線加密體制的一些事實(shí): 私鑰長(zhǎng)度 32bytes 公鑰長(zhǎng)度 64bytes (未壓縮形式) 或者 32bytes(壓縮形式)+ 1byte(前綴) 橢圓曲線...
摘要:有效的數(shù)字簽名使收件人有理由相信該信息是由已知的發(fā)件人認(rèn)證創(chuàng)建的,發(fā)件人不能否認(rèn)已發(fā)送的信息不可否認(rèn),并且信息在傳輸過(guò)程中未被更改完整性。當(dāng)我們說(shuō)簽署交易時(shí),我們實(shí)際上是指簽署序列化交易數(shù)據(jù)的哈希。 特殊交易:合約注冊(cè) 有一種特殊的帶有data,沒有value的交易。表示注冊(cè)一個(gè)新的合約。合約登記交易被發(fā)送到一個(gè)特殊的目的地地址,即零地址。簡(jiǎn)而言之,合約注冊(cè)交易中的+to+字段包含地址...
摘要:公鑰哈希和錢包地址可以通過(guò)互逆運(yùn)算進(jìn)行轉(zhuǎn)換,所以它們是等價(jià)的。使用私鑰對(duì)交易進(jìn)行簽名比特幣錢包間的轉(zhuǎn)賬是通過(guò)交易實(shí)現(xiàn)的。使用公鑰對(duì)簽名進(jìn)行驗(yàn)證交易數(shù)據(jù)被廣播到比特幣網(wǎng)絡(luò)后,節(jié)點(diǎn)會(huì)對(duì)這個(gè)交易數(shù)據(jù)進(jìn)行檢驗(yàn),其中就包括對(duì)簽名的校驗(yàn)。 一句話解釋公鑰、私鑰、地址私鑰:實(shí)際上是一組隨機(jī)數(shù),關(guān)于區(qū)塊鏈中的隨機(jī)數(shù)我們已經(jīng)介紹過(guò)了公鑰:對(duì)私鑰進(jìn)行橢圓曲線加密算法生成,但是無(wú)法通過(guò)公鑰倒推得到私鑰。公...
摘要:本質(zhì)上,比特幣錢包就是一對(duì)這樣的密鑰。例如,一個(gè)錯(cuò)誤比特幣地址就不會(huì)被錢包認(rèn)為是有效的地址,否則這種錯(cuò)誤會(huì)造成資金的丟失。 showImg(https://segmentfault.com/img/remote/1460000013982997?w=1920&h=1053); 最終內(nèi)容請(qǐng)以原文為準(zhǔn):https://wangwei.one/posts/f90... 引言 在 上一篇 文...
摘要:如果公式解析有問(wèn)題,請(qǐng)移步備份鏈接橢圓曲線密碼學(xué)橢圓曲線密碼學(xué)是基于橢圓曲線數(shù)學(xué)的一種公鑰加密方法。橢圓曲線數(shù)字簽名什么是數(shù)字簽名現(xiàn)實(shí)生活中的簽名作用是簽署者對(duì)文件進(jìn)行授權(quán)防止交易中的抵賴發(fā)生。 如果SF公式解析有問(wèn)題,請(qǐng)移步備份鏈接 https://blog.csdn.net/chenmo1... 橢圓曲線密碼學(xué) 橢圓曲線密碼學(xué)(ECC, Elliptic Curve Crypt...
閱讀 2406·2021-10-09 09:44
閱讀 2140·2021-10-08 10:05
閱讀 3432·2021-07-26 23:38
閱讀 3008·2019-08-28 18:16
閱讀 820·2019-08-26 11:55
閱讀 1827·2019-08-23 18:29
閱讀 2042·2019-08-23 18:05
閱讀 1373·2019-08-23 17:02