摘要:通過命令行中顯示結論壓縮形式占據一個或的前綴的坐標從代碼中生成注原文作者的密鑰對的產生過程是冗長的,然而使用來完成卻不難??梢允且粋€完整的密鑰對或者是一個多帶帶的公鑰。
bitcoin中的密鑰綜述
關于bitcon中使用的橢圓曲線加密體制的一些事實:
私鑰長度 32bytes
公鑰長度 64bytes (未壓縮形式) 或者 32bytes(壓縮形式)+ 1byte(前綴)
橢圓曲線C是secp256k1曲線
橢圓曲線加密體制基于模運算
在本文中,我們唯一的輸入就是私鑰。公鑰可以唯一地從私鑰推導而來。我們先使用openssl命令行生成一個密鑰對樣例,然后再嘗試編寫C語言代碼進行同樣的操作。
在OpenSSL命令行中生成 私鑰一個私鑰是一個隨機選取的32 bytes的數字,并且我們都知道32 bytes存儲的數字可以轉換成為一個非常大的數值,最大可以達到2256。去猜測這樣一個數字是很荒謬的,因此可以認為它的生成具有很高的隨機性。
得到一個全新的私鑰是非常容易的:
$ openssl ecparam -name secp256k1 -genkey -out ec-priv.pem
生成的結果文件ec-prive.pem中包含了曲線名稱(secp256k1)和私鑰,它們連同一些其它字符一起被base64編碼。
這個文件可以被快速解碼為可讀的16進制形式:
openssl ec -in ec-priv.pem -text -noout
以下是我所生成的密鑰對形式(你生成的與我的不相同):
read EC key Private-Key: (256 bit) priv: 16:26:07:83:e4:0b:16:73:16:73:62:2a:c8:a5:b0: 45:fc:3e:a4:af:70:f7:27:f3:f9:e9:2b:dd:3a:1d: dc:42 pub: 04:82:00:6e:93:98:a6:98:6e:da:61:fe:91:67:4c: 3a:10:8c:39:94:75:bf:1e:73:8f:19:df:c2:db:11: db:1d:28:13:0c:6b:3b:28:ae:f9:a9:c7:e7:14:3d: ac:6c:f1:2c:09:b8:44:4d:b6:16:79:ab:b1:d8:6f: 85:c0:38:a5:8c ASN1 OID: secp256k1
其中私鑰被顯示為這樣的形式會更直觀:
16 26 07 83 e4 0b 16 73 16 73 62 2a c8 a5 b0 45 fc 3e a4 af 70 f7 27 f3 f9 e9 2b dd 3a 1d dc 42
這個私鑰代表著你的身份,必須安全地將它保存。也就是說,如果這不是我用來舉例的而生成的私鑰,我不會將它分享給任何人。我們會用這個私鑰來簽名我們的信息,這樣的話所有人就會相信這個信息確實是我本人發出的。如果其他人竊取了你的私鑰,他將能夠偽造你的身份。在bitcoin中,他就能夠拿走你所有的錢。一定要當心!
公鑰默認情況下,一個公鑰是由兩個 32bytes 的大數組成,這種就是所謂的未壓縮形式。這兩個數字代表著二維坐標系上,secp256k1橢圓曲線上的一個點(x,y),它是符合以下方程的:
y2 = x3 + 7
這個點的坐標是由私鑰決定的,但是反之,從點的坐標推斷私鑰是不可行的。畢竟,這就是橢圓曲線加密算法安全性的保障。根據依賴特性,結合上述方程和一個x值,可以計算得到一個對應的y值。事實上,壓縮形式的公鑰就是根據這個原理將y值省略掉來節省空間的。
我們可以將上述密鑰對中的公鑰部分取出,存儲到一個叫做ec-pub.pem的外部文件中:
$ openssl ec -in ec-priv.pem -pubout -out ec-pub.pem
接著將它解碼:
$ openssl ec -in ec-pub.pem -pubin -text -noout
未包含私鑰部分的文本形式就會顯示出來:
read EC key Private-Key: (256 bit) pub: 04:82:00:6e:93:98:a6:98:6e:da:61:fe:91:67:4c: 3a:10:8c:39:94:75:bf:1e:73:8f:19:df:c2:db:11: db:1d:28:13:0c:6b:3b:28:ae:f9:a9:c7:e7:14:3d: ac:6c:f1:2c:09:b8:44:4d:b6:16:79:ab:b1:d8:6f: 85:c0:38:a5:8c ASN1 OID: secp256k1
一個更加直觀的版本:
04 82 00 6e 93 98 a6 98 6e da 61 fe 91 67 4c 3a 10 8c 39 94 75 bf 1e 73 8f 19 df c2 db 11 db 1d 28 13 0c 6b 3b 28 ae f9 a9 c7 e7 14 3d ac 6c f1 2c 09 b8 44 4d b6 16 79 ab b1 d8 6f 85 c0 38 a5 8c
這個未壓縮的版本包含了65個字節:
一個不變的04前綴
32 bytes 的 x 坐標
32 bytes 的 y 坐標
很容易就可以將它轉換為壓縮形式。我們只需省略掉y并改掉它的前綴。這個新前綴是根據y來決定的:前綴是 02表示y是偶數值,前綴是 03表示y是奇數值。
通過:
$ openssl ec -in ec-pub.pem -pubin -text -noout -conv_form compressed
命令行中顯示:
read EC key Private-Key: (256 bit) pub: 02:82:00:6e:93:98:a6:98:6e:da:61:fe:91:67:4c: 3a:10:8c:39:94:75:bf:1e:73:8f:19:df:c2:db:11: db:1d:28 ASN1 OID: secp256k1
結論, 壓縮形式占據33bytes:
一個02 或03 的前綴
32bytes 的 x 坐標
從代碼中生成(注:原文作者的 repository)
密鑰對的產生過程是冗長的,然而使用OpenSSL來完成卻不難。我ec.h中聲明了一個幫助函數,原型如下:
EC_KEY *bbp_ec_new_keypair(const uint8_t *priv_bytes);
我們來一起分析一下原文中的部分代碼,一些OpenSSL中的數據結構如下:
BN_CTX, BIGNUM
EC_KEY
EC_GROUP, EC_POINT
前兩個結構體屬于OpenSSL的任意精度算數(大數)部分,因為我們需要處理非常大的數字。EC_KEY可以是一個完整的密鑰對或者是一個多帶帶的公鑰。EC_GROUP和EC_POINT幫助我們根據私鑰來計算公鑰。
最重要的部分,我們初始化了一個EC_KEY結構來存儲一對密鑰對:
key = EC_KEY_new_by_curve_name(NID_secp256k1);
填充私鑰是很容易的,但是需要一個過渡過程。再將要輸入的priv_bytes填入密鑰對之前,我們需要將它轉換為BIGNUM,在這里命名為priv。
BN_init(&priv); BN_bin2bn(priv_bytes, 32, &priv); EC_KEY_set_private_key(key, &priv);
對于復雜的大數操作,OpenSSL需要一個上下文環境,這就是BN_CTX需要被創建的原因。公鑰的推導需要一個深層次的數學理解,而這并不是這篇文章所要達到的目標。簡單來說,就是我們在曲線上定位一個固定的點G(generator, 代碼中的group), 然后乘以標量私鑰n,而這是一個在模運算中不可逆的過程。它的結果P = n * G就是第二個點,公鑰pub。最終,公鑰被載入到密鑰對中:
ctx = BN_CTX_new(); BN_CTX_start(ctx); group = EC_KEY_get0_group(key); pub = EC_POINT_new(group); EC_POINT_mul(group, pub, &priv, NULL, NULL, ctx); EC_KEY_set_public_key(key, pub);
最后時刻,我們要在ex-ec-keypair.c測試密鑰對。我們期待如果給定一個固定的私鑰,通過代碼產生的結果和命令行中產生的結果相同。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23967.html
摘要:二如何理解公鑰和私鑰非對稱加密算法需要兩個密鑰公開密鑰和私有密鑰。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。三非對稱加密解密原理非對稱加密算法中,常用的就是算法了,以下就以算法為例來講解非對稱加密算法的實現原理。 非對稱加密,在現在網絡應用中,有這非常廣泛的場景,更是加密貨幣的基礎。本文主要介紹非對稱加密、解密的原理和過程,以及在區塊鏈中的使用。 一、非對稱...
摘要:本文首發于深入淺出區塊鏈社區原文鏈接理解開發錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發于深入淺出區塊鏈社區原文鏈接:理解開發HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:本文首發于深入淺出區塊鏈社區原文鏈接理解開發錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發于深入淺出區塊鏈社區原文鏈接:理解開發HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:通過入門區塊鏈本文翻譯自的文章原文地址區塊鏈可能是繼互聯網之后最重大和最具突破性的技術。先不管對比特幣和其他加密貨幣價格的瘋狂行情,本文旨在幫助讀者入門區塊鏈技術。 通過Python入門區塊鏈 本文翻譯自 Adil Moujahid 的文章 A Practical Introduction to Blockchain with Python原文地址:http://adilmoujahi...
閱讀 2430·2021-10-11 10:57
閱讀 1279·2021-10-09 09:59
閱讀 1998·2019-08-30 15:53
閱讀 3212·2019-08-30 15:53
閱讀 1008·2019-08-30 15:45
閱讀 738·2019-08-30 15:44
閱讀 3446·2019-08-30 14:24
閱讀 954·2019-08-30 14:21