摘要:通過命令行中顯示結(jié)論壓縮形式占據(jù)一個或的前綴的坐標(biāo)從代碼中生成注原文作者的密鑰對的產(chǎn)生過程是冗長的,然而使用來完成卻不難??梢允且粋€完整的密鑰對或者是一個多帶帶的公鑰。
bitcoin中的密鑰綜述
關(guān)于bitcon中使用的橢圓曲線加密體制的一些事實:
私鑰長度 32bytes
公鑰長度 64bytes (未壓縮形式) 或者 32bytes(壓縮形式)+ 1byte(前綴)
橢圓曲線C是secp256k1曲線
橢圓曲線加密體制基于模運(yùn)算
在本文中,我們唯一的輸入就是私鑰。公鑰可以唯一地從私鑰推導(dǎo)而來。我們先使用openssl命令行生成一個密鑰對樣例,然后再嘗試編寫C語言代碼進(jìn)行同樣的操作。
在OpenSSL命令行中生成 私鑰一個私鑰是一個隨機(jī)選取的32 bytes的數(shù)字,并且我們都知道32 bytes存儲的數(shù)字可以轉(zhuǎn)換成為一個非常大的數(shù)值,最大可以達(dá)到2256。去猜測這樣一個數(shù)字是很荒謬的,因此可以認(rèn)為它的生成具有很高的隨機(jī)性。
得到一個全新的私鑰是非常容易的:
$ openssl ecparam -name secp256k1 -genkey -out ec-priv.pem
生成的結(jié)果文件ec-prive.pem中包含了曲線名稱(secp256k1)和私鑰,它們連同一些其它字符一起被base64編碼。
這個文件可以被快速解碼為可讀的16進(jìn)制形式:
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
這個私鑰代表著你的身份,必須安全地將它保存。也就是說,如果這不是我用來舉例的而生成的私鑰,我不會將它分享給任何人。我們會用這個私鑰來簽名我們的信息,這樣的話所有人就會相信這個信息確實是我本人發(fā)出的。如果其他人竊取了你的私鑰,他將能夠偽造你的身份。在bitcoin中,他就能夠拿走你所有的錢。一定要當(dāng)心!
公鑰默認(rèn)情況下,一個公鑰是由兩個 32bytes 的大數(shù)組成,這種就是所謂的未壓縮形式。這兩個數(shù)字代表著二維坐標(biāo)系上,secp256k1橢圓曲線上的一個點(x,y),它是符合以下方程的:
y2 = x3 + 7
這個點的坐標(biāo)是由私鑰決定的,但是反之,從點的坐標(biāo)推斷私鑰是不可行的。畢竟,這就是橢圓曲線加密算法安全性的保障。根據(jù)依賴特性,結(jié)合上述方程和一個x值,可以計算得到一個對應(yīng)的y值。事實上,壓縮形式的公鑰就是根據(jù)這個原理將y值省略掉來節(jié)省空間的。
我們可以將上述密鑰對中的公鑰部分取出,存儲到一個叫做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個字節(jié):
一個不變的04前綴
32 bytes 的 x 坐標(biāo)
32 bytes 的 y 坐標(biāo)
很容易就可以將它轉(zhuǎn)換為壓縮形式。我們只需省略掉y并改掉它的前綴。這個新前綴是根據(jù)y來決定的:前綴是 02表示y是偶數(shù)值,前綴是 03表示y是奇數(shù)值。
通過:
$ 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
結(jié)論, 壓縮形式占據(jù)33bytes:
一個02 或03 的前綴
32bytes 的 x 坐標(biāo)
從代碼中生成(注:原文作者的 repository)
密鑰對的產(chǎn)生過程是冗長的,然而使用OpenSSL來完成卻不難。我ec.h中聲明了一個幫助函數(shù),原型如下:
EC_KEY *bbp_ec_new_keypair(const uint8_t *priv_bytes);
我們來一起分析一下原文中的部分代碼,一些OpenSSL中的數(shù)據(jù)結(jié)構(gòu)如下:
BN_CTX, BIGNUM
EC_KEY
EC_GROUP, EC_POINT
前兩個結(jié)構(gòu)體屬于OpenSSL的任意精度算數(shù)(大數(shù))部分,因為我們需要處理非常大的數(shù)字。EC_KEY可以是一個完整的密鑰對或者是一個多帶帶的公鑰。EC_GROUP和EC_POINT幫助我們根據(jù)私鑰來計算公鑰。
最重要的部分,我們初始化了一個EC_KEY結(jié)構(gòu)來存儲一對密鑰對:
key = EC_KEY_new_by_curve_name(NID_secp256k1);
填充私鑰是很容易的,但是需要一個過渡過程。再將要輸入的priv_bytes填入密鑰對之前,我們需要將它轉(zhuǎn)換為BIGNUM,在這里命名為priv。
BN_init(&priv); BN_bin2bn(priv_bytes, 32, &priv); EC_KEY_set_private_key(key, &priv);
對于復(fù)雜的大數(shù)操作,OpenSSL需要一個上下文環(huán)境,這就是BN_CTX需要被創(chuàng)建的原因。公鑰的推導(dǎo)需要一個深層次的數(shù)學(xué)理解,而這并不是這篇文章所要達(dá)到的目標(biāo)。簡單來說,就是我們在曲線上定位一個固定的點G(generator, 代碼中的group), 然后乘以標(biāo)量私鑰n,而這是一個在模運(yùn)算中不可逆的過程。它的結(jié)果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測試密鑰對。我們期待如果給定一個固定的私鑰,通過代碼產(chǎn)生的結(jié)果和命令行中產(chǎn)生的結(jié)果相同。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23967.html
摘要:二如何理解公鑰和私鑰非對稱加密算法需要兩個密鑰公開密鑰和私有密鑰。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。三非對稱加密解密原理非對稱加密算法中,常用的就是算法了,以下就以算法為例來講解非對稱加密算法的實現(xiàn)原理。 非對稱加密,在現(xiàn)在網(wǎng)絡(luò)應(yīng)用中,有這非常廣泛的場景,更是加密貨幣的基礎(chǔ)。本文主要介紹非對稱加密、解密的原理和過程,以及在區(qū)塊鏈中的使用。 一、非對稱...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開發(fā)錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發(fā)以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開發(fā)錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發(fā)以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:也就是說,比特幣是一個完全出于社區(qū)共識的貨幣。所謂全稱為,它是比特幣交易的基本單位。根據(jù)比特幣的協(xié)議,一個區(qū)塊的大小是而一筆交易大概是,因此一個區(qū)塊大概可以包含筆交易。 誕生 比特幣誕生于 2008 年,一個網(wǎng)名為中本聰?shù)娜耍岢隽艘粋€設(shè)想: 創(chuàng)造一種不受政府或任何組織控制的貨幣 比特幣的本質(zhì)就是一串?dāng)?shù)字,沒有任何資產(chǎn)支持(現(xiàn)行貨幣背后都是國家或銀行提供資產(chǎn)支持)。也就是說,比特幣是一...
摘要:通過入門區(qū)塊鏈本文翻譯自的文章原文地址區(qū)塊鏈可能是繼互聯(lián)網(wǎng)之后最重大和最具突破性的技術(shù)。先不管對比特幣和其他加密貨幣價格的瘋狂行情,本文旨在幫助讀者入門區(qū)塊鏈技術(shù)。 通過Python入門區(qū)塊鏈 本文翻譯自 Adil Moujahid 的文章 A Practical Introduction to Blockchain with Python原文地址:http://adilmoujahi...
閱讀 2435·2021-10-11 10:57
閱讀 1287·2021-10-09 09:59
閱讀 2001·2019-08-30 15:53
閱讀 3219·2019-08-30 15:53
閱讀 1015·2019-08-30 15:45
閱讀 747·2019-08-30 15:44
閱讀 3455·2019-08-30 14:24
閱讀 957·2019-08-30 14:21