国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

區塊鏈中的DCDSA:橢圓曲線數字簽名

dack / 1862人閱讀

摘要:既然我們已經可以產生橢圓曲線密鑰對,我們接下來就用使用它來進行消息的簽名和驗證。簽名橢圓曲線簽名算法就是在中,各方必須約定一個共同的哈希函數因為我們將要簽名的對象是消息,而不是消息本身。這種行為也是造成交易可塑性的原因之一。

既然我們已經可以產生橢圓曲線密鑰對,我們接下來就用使用它來進行消息的簽名和驗證。我所指的消息是任何形式,無論是文本還是二進制形式,只要它們有被驗證合法性的需要。特別的是,bitcoin客戶端通過簽名來證明交易的有效性,反之,礦工則是通過驗證這樣的簽名,來批準并廣播合法的交易。

ECDSA 簽名

橢圓曲線簽名算法就是ECDSA(Elliptic-Curve Digital Signature Algorithm).在ECDSA中,各方必須約定一個共同的哈希函數H, 因為我們將要簽名的對象是H(消息),而不是消息本身。值得注意的是,只有簽名方S有私鑰的權限,驗證方V只需要拿到相應的公鑰就可以進行驗證。本文中,我將使用上一章所創建的密鑰對。

下面的案例中,我們簽名的對象是SHA-256摘要。但bitcoin中指定的H函數是HASH256,也就是指雙重SHA-256

簽名

第一步把我們的消息存入文件,命名ex-message.txt

This is a very confidential message

之后,我們用私鑰對其SHA-256摘要進行簽名。

$ openssl dgst -sha256 -sign ec-priv.pem ex-message.txt >ex-signature.der

ex-signature.der文件是簽名的DER格式。OpenSSL使用DER編碼任何二進制輸出,但這里我們忽略這個細節。你不需要了解ECDSA簽名的語法,只需要記住它僅僅是一組的大數對(r,s)

你可能會注意到,每一次你執行程序,簽名都發生變化,也就是說默認的簽名過程是不具有確定性的。這就給序列化區塊鏈交易時帶來了問題,因為簽名是交易字節序列中的一部分,并且你一定知道txid是對交易進行哈希得來的。因此,每當你簽名一筆交易txid就會隨之變化。這種行為也是造成交易可塑性的原因之一。

為了顯示十六進制編碼的簽名,只需添加-hex參數。

$ openssl dgst -sha256 -hex -sign ec-priv.pem ex-message.txt

為了重用剛剛輸出的結果,最好使用hexdup已生成的DER文件。

$ hexdump ex-signature.der
驗證

無論什么時候將合法消息發布到網絡,接收者都希望能夠得到一個附件的簽名。在假設我們已經得到作者公鑰的情況下,無論是原消息還是簽名,都必須作為驗證流程的輸入數據:

$ openssl dgst -sha256 -verify ec-pub.pem -signature ex-signature.der ex-message.txt
代碼版本

我們使用代碼來完成上文中在命令行中完成的同樣的工作。

簽名

OpenSSL使簽名流程變得簡單,這一部分可以在 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是一個簡單的結構,用于存儲上文所說的(r,s)對:

struct {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;

使用i2d_ECDSA_SIG函數,我們也可以得到DER編碼的簽名:

der_len = ECDSA_size(key);
der = calloc(der_len, sizeof(uint8_t));
der_copy = der;
i2d_ECDSA_SIG(signature, &der_copy);
驗證

驗證同樣很簡單,可以在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));

因為無法得到私鑰,我們利用使用下面的輔助函數將pub_bytes解碼為壓縮形式。

EC_KEY *bbp_ec_new_pubkey(const uint8_t *pub_bytes, size_t pub_len);

另一方面,der_bytes是簽名程序返回的DER格式的簽名。我們將解碼DER簽名到更方便的ECDSA_SIG結構中,然后與消息摘要比較進行驗證。

ECDSA_do_verify函數的返回值:

1,簽名合法

0,簽名不合法

-1,出現未知錯誤

注意:使用ECDSA_verify可以跳過簽名的解碼過程,因為它需要的輸入值是DER形式的簽名。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23965.html

相關文章

  • 區塊鏈中密鑰對的生成原理

    摘要:通過命令行中顯示結論壓縮形式占據一個或的前綴的坐標從代碼中生成注原文作者的密鑰對的產生過程是冗長的,然而使用來完成卻不難。可以是一個完整的密鑰對或者是一個單獨的公鑰。 bitcoin中的密鑰綜述 關于bitcon中使用的橢圓曲線加密體制的一些事實: 私鑰長度 32bytes 公鑰長度 64bytes (未壓縮形式) 或者 32bytes(壓縮形式)+ 1byte(前綴) 橢圓曲線...

    jackzou 評論0 收藏0
  • 是的我想說的技術!

    摘要:有效的數字簽名使收件人有理由相信該信息是由已知的發件人認證創建的,發件人不能否認已發送的信息不可否認,并且信息在傳輸過程中未被更改完整性。當我們說簽署交易時,我們實際上是指簽署序列化交易數據的哈希。 特殊交易:合約注冊 有一種特殊的帶有data,沒有value的交易。表示注冊一個新的合約。合約登記交易被發送到一個特殊的目的地地址,即零地址。簡而言之,合約注冊交易中的+to+字段包含地址...

    focusj 評論0 收藏0
  • 區塊鏈之公鑰、私鑰、地址之間的關系

    摘要:公鑰哈希和錢包地址可以通過互逆運算進行轉換,所以它們是等價的。使用私鑰對交易進行簽名比特幣錢包間的轉賬是通過交易實現的。使用公鑰對簽名進行驗證交易數據被廣播到比特幣網絡后,節點會對這個交易數據進行檢驗,其中就包括對簽名的校驗。 一句話解釋公鑰、私鑰、地址私鑰:實際上是一組隨機數,關于區塊鏈中的隨機數我們已經介紹過了公鑰:對私鑰進行橢圓曲線加密算法生成,但是無法通過公鑰倒推得到私鑰。公...

    104828720 評論0 收藏0
  • 基于Java語言構建區塊鏈(五)—— 地址(錢包)

    摘要:本質上,比特幣錢包就是一對這樣的密鑰。例如,一個錯誤比特幣地址就不會被錢包認為是有效的地址,否則這種錯誤會造成資金的丟失。 showImg(https://segmentfault.com/img/remote/1460000013982997?w=1920&h=1053); 最終內容請以原文為準:https://wangwei.one/posts/f90... 引言 在 上一篇 文...

    entner 評論0 收藏0
  • 區塊鏈的基石--橢圓曲線密碼學

    摘要:如果公式解析有問題,請移步備份鏈接橢圓曲線密碼學橢圓曲線密碼學是基于橢圓曲線數學的一種公鑰加密方法。橢圓曲線數字簽名什么是數字簽名現實生活中的簽名作用是簽署者對文件進行授權防止交易中的抵賴發生。 如果SF公式解析有問題,請移步備份鏈接 https://blog.csdn.net/chenmo1... 橢圓曲線密碼學 橢圓曲線密碼學(ECC, Elliptic Curve Crypt...

    DoINsiSt 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<