加快生成btc密鑰的方法
1. 入門科普:比特幣的私鑰、公鑰和地址是什麼
上一篇,我們講到了幣圈要注意防範傳銷、洗錢等一類的騙局,保護好自己的資產。這一篇,我要告訴大家,進行比特幣交易時,都會用到的私鑰、公鑰與地址,如果你還不了解它們的重要性,隨便交易,很容易弄丟自己的資產。那什麼是私鑰、公鑰與地址?三者之間有著什麼樣的關系呢?
01
私鑰
1.導出:
創建錢包後,輸入密碼可以導出私鑰,私鑰由很長的字元串組成,且是隨機生成的, 一個地址只有一個私鑰。
2.用途:
用於控制交易時的簽名,擁有私鑰才能控制賬戶的資金,相當於銀行賬戶的交易密碼,用來解密公鑰加密的信息。
3.注意事項:
私鑰是用來證明這筆交易的發起人確實是比特幣的所有者。所以 私鑰一定不能曝光,私鑰一旦泄露,你的比特幣將會有被盜的風險。 用戶必須保管好私鑰,防止泄露或丟失。
02
公鑰
1.導出:
公鑰是由私鑰通過演算法生成的,使用了橢圓曲線加密, 通過私鑰可以計算出唯一的公鑰。
2.用途:
公鑰是用來驗證交易的簽名,一個私鑰簽名的數據,只有對應的公鑰才能對其進行驗證,公鑰相當於銀行賬戶,公開後無風險。
03
地址
1.導出:
地址由公鑰生成的,使用了哈希運算。創建錢包後會生成一個以「0x」 開頭的 42 位字元串,這個字元串就是錢包地址,一個錢包對應一個錢包地址, 地址唯一且不能修改,也就是說一個錢包中所有代幣的轉賬收款地址都是一樣的。
2.用途:
由於公鑰太長,在交易中不方便使用,所以就有了地址,地址是由公鑰生成的,地址相當於銀行卡號,用來發送和接收比特幣。
3.注意事項:
平台上不同代幣的轉賬收款地址一般都不同,因此,轉幣到交易平台前一定要確認好地址。
總結
私鑰 → 公鑰 → 錢包地址 (不可逆)
私鑰用來簽名交易,公鑰用來驗證私鑰簽名的交易,地址用來收款。
公鑰、私鑰以及地址都在比特幣交易中起到了不同的作用,所以才能順利的完成一筆數字貨幣的交易。 所以用戶必須好好保存,防止泄露重要信息。
2. 4. 比特幣的密鑰、地址和錢包 - 精通比特幣筆記
比特幣的所有權是通過密鑰、比特幣地址和數字簽名共同確定的。密鑰不存在於比特幣網路中,而是用戶自己保存,或者利用管理私鑰的軟體-錢包來生成及管理。
比特幣的交易必須有有效簽名才會被存儲在區塊中,因此擁有密鑰就擁有對應賬戶中的比特幣。密鑰都是成對出現的,由一個公鑰和一個私鑰組成。公鑰相當於銀行賬號,私鑰就相當於銀行卡密碼。通常情況下密鑰由錢包軟體管理,用戶不直接使用密鑰。
比特幣地址通常是由公鑰計算得來,也可以由比特幣腳本得來。
比特幣私鑰通常是數字,由比特幣系統隨機( 因為演算法的可靠性與隨機性正相關,所以隨機性必須是真隨機,不是偽隨機,因此比特幣系統可以作為隨機源來使用 )生成,然後將私鑰作為輸入,使用橢圓曲線演算法這個單向加密函數生成對應的公鑰,再將公鑰作為輸入,使用單向加密哈希函數生成地址。例如,通過公鑰K得到地址A的計算方式為:
其中SHA256和PIPEMD160被稱為雙哈希或者HASH160,Base58Check是帶有驗證功能的Base58編碼,驗證方式為先計算原始數據(編碼前)的驗證碼,再比較編碼後數據的驗證碼,相同則地址有效,否則無效。而在使用Base58Check編碼前,需要對數據做處理。
處理方式為: 版本前綴 + 雙哈希後的數據 + 校驗碼
其中版本前綴是自定義的,如比特幣私鑰的前綴是0x80,校驗碼是把版本前綴和雙哈希後的數據拼接起來,進行兩次SHA256計算,取前4位元組。得到處理的數據後,再進行Base58編碼,得到最終的結果。
下圖是Base58Check版本前綴和Base58編碼後的結果
密鑰可以採用不同的編碼格式,得到的編碼後結果雖然不同,但密鑰本身沒有任何變化,採用哪種編碼格式,就看情況而論了,最終目的都是方便人們准確無誤的使用和識別密鑰。
下圖是相同私鑰採用不同編碼方式的結果:
公鑰也有很多種格式,不過最重要的是公鑰被分為壓縮格式和非壓縮格式,帶04前綴的公鑰為非壓縮格式的公鑰,而03,02開頭的標識壓縮格式的公鑰。
前面說過,公鑰是橢圓曲線上的一個點,由一對坐標(x, y)表示,再加上前綴,公鑰可以表示為:前綴 x y。
比如一個公鑰的坐標為:
以非壓縮格式為例,公鑰為(略長):
壓縮格式的公鑰可以節省一定的存儲,對於每天成千上萬的比特幣交易記錄來說,這一點點的節省能起到很大效果。
因為橢圓曲線實際上是一個方程(y2 mod p = (x3 + 7)mod P, y2是y的平方,x3是x的立方),而公鑰是橢圓曲線上的一個點,那麼公鑰即為方程的一個解,如果公鑰中只保留x,那麼可以通過解方程得到y,而壓縮公鑰格式有兩個前綴是因為對y2開方,會得到正負兩個解,在素數p階的有限域上使用二進制算術計算橢圓曲線的時候,y坐標或奇或偶,所以用02表示y為奇數,03表示y為偶數。
所以壓縮格式的公鑰可以表示為:前綴x
以上述公鑰的坐標為准,y為奇數為例,公鑰K為:
不知道大家發現沒有,這種壓縮方式存在一個問題,即一個私鑰可以得出兩個公鑰,壓縮和非壓縮公鑰,而這兩個公鑰都對應同一個私鑰,都合法,但生成的比特幣地址卻不相同,這就涉及到錢包軟體的實現方式,是使用壓縮公鑰還是非壓縮公鑰,或者二者皆用,這個問題後面來介紹。
比特幣錢包最主要的功能就是替用戶保管比特幣私鑰,比特幣錢包有很多種,比如非確定性(隨機)錢包,確定性(種子)錢包。所謂的非確定性是指錢包運行時會生成足夠的私鑰(比如100個私鑰),每個私鑰僅會使用一次,這樣私鑰管理就很麻煩。確定性錢包擁有一個公共種子,單向離散方程使用種子生成私鑰,種子足夠回收所有私鑰,所以在錢包創建時,簡單備份下,就可以在錢包之間轉移輸入。
這里要特別介紹下助記碼詞彙。助記碼詞彙是英文單詞序列,在BIP0039中提出。這些序列對應著錢包中的種子,種子可以生成隨機數,隨機數生成私鑰,私鑰生成公鑰,便有了你需要的一切。所以單詞的順序就是錢包的備份,通過助記碼詞彙能重建錢包,這比記下一串隨機數要強的多。
BIP0039定義助記碼和種子的創建過程如下:
另外一種重要的錢包叫做HD錢包。HD錢包提供了隨機(不確定性) 鑰匙有兩個主要的優勢。
第一,樹狀結構可以被用來表達額外的組織含義。比如當一個特定分支的子密鑰被用來接收交易收入並且有另一個分支的子密鑰用來負責支付花費。不同分支的密鑰都可以被用在企業環境中,這就可以支配不同的分支部門,子公司,具體功能以及會計類別。
第二,它可以允許讓使用者去建立一個公共密鑰的序列而不需要訪問相對應的私鑰。這可允許HD錢包在不安全的伺服器中使用或者在每筆交易中發行不同的公共鑰匙。公共鑰匙不需要被預先載入或者提前衍生,但是在伺服器中不具有可用來支付的私鑰。
BIP0038提出了一個通用標准,使用一個口令加密私鑰並使用Base58Check對加密的私鑰進行編碼,這樣加密的私鑰就可以安全地保存在備份介質里,安全地在錢包間傳輸,保持密鑰在任何可能被暴露情況下的安全性。這個加密標准使用了AES,這個標准由NIST建立,並廣泛應用於商業和軍事應用的數據加密。
BIP0038加密方案是: 輸入一個比特幣私鑰,通常使用WIF編碼過,base58chek字元串的前綴「5」。此外BIP0038加密方案需要一個長密碼作為口令,通常由多個單詞或一段復雜的數字字母字元串組成。BIP0038加密方案的結果是一個由base58check編碼過的加密私鑰,前綴為6P。如果你看到一個6P開頭的的密鑰,這就意味著該密鑰是被加密過,並需個口令來轉換(解碼) 該密鑰回到可被用在任何錢包WIF格式的私鑰(前綴為5)。許多錢包APP現在能夠識別BIP0038加密過的私鑰,會要求用戶提供口令解碼並導入密鑰。
最通常使用BIP0038加密的密鑰用例是紙錢包一一張紙張上備份私鑰。只要用戶選擇了強口令,使用BIP0038加密的私鑰的紙錢包就無比的安全,這也是一種很棒的比特幣離線存儲方式(也被稱作「冷存儲」)。
P2SH函數最常見的實現時用於多重簽名地址腳本。顧名思義,底層腳本需要多個簽名來證明所有權,然後才能消費資金。這類似在銀行開設一個聯合賬戶。
你可以通過計算,生成特殊的比特幣地址,例如我需要一個Hello開頭的地址,你可以通過腳本來生成這樣一個地址。但是每增加一個字元,計算量會增加58倍,超過7個字元,需要專門的硬體或者礦機來生成,如果是8~10個字元,那麼計算量將無法想像。
3. 如何從交易所獲取私鑰
進入貨幣圈,買賣代幣是不可避免的。交換是大多數人選擇的對象。代幣通常存儲在交易所或錢包中。對於普通投資者來說,代幣通常存儲在交易所。在這里,Lone Bird簡要介紹了存儲在交易所中的代幣是如何保存或轉移的。
以比特幣為例;交易平台每天都有巨大的比特幣交易活動,用戶在平台上擁有數萬個比特幣。為了保證比特幣的安全性,交易所每天都會將比特幣存儲在主機伺服器上,將比特幣放入冷庫錢包,只在伺服器上保存少量比特幣,以應對正常的取款請求。還有一件事。如果交易所將用戶的比特幣用於其他目的,用戶將沒有硬幣可以提取。
為什麼把它放在冰冷的錢包里是出於安全考慮。即使電腦被黑客入侵,黑客也無法獲得比特幣的私鑰。私鑰不會出現在其他在線終端或網路上;交換將生成大量的私鑰。以及保存用戶比特幣的地址。
那麼,交換機是如何執行冷庫和取款的呢?首先是私鑰的生成和備份,
1)在完全離線的計算機上生成10000個私鑰和對應的地址,使用AES加密私鑰,然後刪除原私鑰。
2)將AES密碼保存在屬於不同地方的兩個人手中。
3)使用加密私鑰和明文地址生成QR碼加密文件,並掃描一台完全離線的電腦生成該地址文件的QR碼供日常使用。
要將硬幣從熱錢包轉移到冷錢包,每次必須是一個未使用的地址,且每個地址不能重復使用,然後將硬幣在線轉移到冷錢包,
1)從地址文件中取出對應的地址;
2)根據安全級別,每個地址不超過1000個比特幣,每個地址使用一次,不使用。
最後,從冰冷的錢包里取出硬幣。取幣過程如下:
1)通過二維碼將私鑰密文掃描到一台完全離線的電腦中;
2)擁有AES密碼的人在完全離線的計算機上解密它,並獲得私鑰的明文。掃描二維碼,將私鑰導入另一台計算機,進行交易簽名,並通過二維碼將簽名交易同步到所有網路計算機,並進行廣播。
4. 8 - HdWalletBTC 生成錢包私鑰地址
生成地址記錄:
private Key:
address:
public Key:
private Key:
address:
public Key:
private Key:
address:
public Key:
5. bitcoin私鑰是如何產生的
比特幣地址和私鑰是怎樣生成的?比特幣使用橢圓曲線演算法生成公鑰和私鑰,選擇的是secp256k1曲線。生成的公鑰是33位元組的大數,私鑰是32位元組的大數,錢包文件wallet.dat中直接保存了公鑰和私鑰。我們在接收和發送比特幣時用到的比特幣地址是公鑰經過演算法處理後得到的,具體過程是公鑰先經過SHA-256演算法處理得到32位元組的哈希結果,再經過RIPEMED演算法處理後得到20位元組的摘要結果,再經過字元轉換過程得到我們看到的地址。這個字元轉換過程與私鑰的字元轉換過程完成相同,步驟是先把輸入的內容(對於公鑰就是20位元組的摘要結果,對於私鑰就是32位元組的大數)增加版本號,經過連續兩次SHA-256演算法,取後一次哈希結果的前4位元組作為校驗碼附在輸入內容的後面,然後再經過Base58編碼,得到字元串。
6. 比特幣的私鑰怎麼生成的
私鑰是密文持有人設置的隨機的數字。
私鑰的生成是隨機的數字,通過拋硬幣將正面向上的計為0,反面向上計為1,連續拋256次,就隨機得到一個256位的二進制數字。生成了私鑰,就可以通過加密函數來生成一個地址。私鑰是一個64個字元長的代碼,包括字母a到f和數字1到9的任何混合。
7. BTC之隨機數生成
有兩個最主要的方法來生成隨機數:
a) 通過測量某些隨機的物理現象,然後補償測量過程中可能出現的偏差。比如大氣雜訊、熱雜訊和其他外部電磁以及量子現象。從自然資源中獲取熵的速度取決於被測量的潛在物理現象,因此它們的速率是有限的,往往比較慢。
b) 使用計算演算法,可以產生明顯隨機結果的長序列,實際上由較短的初始值(稱為種子)確定。結果是,如果種子的值是已知的,整個看似隨機的序列可以被重復產生。這類隨機數生成器被稱為偽隨機數生成器。這類生成器類型是非阻塞的,可以大量產生數據。
/dev/random 可以用作隨機數生成器或者偽隨機數生成器,取決於不同的實現。
在linux下,隨機數生成器有一個容納雜訊數據的熵池,在讀取時,/dev/random設備會返回小於熵池雜訊總數的隨機位元組。/dev/random可生成高隨機性的 公鑰 或 一次性密碼本 。若熵池空了,對/dev/random的讀操作將會被 阻塞 ,直到收集到了足夠的環境雜訊為止。這樣的設計使得/dev/random是真正的 隨機數發生器 ,提供了最大可能的隨機數據熵,建議在需要生成高強度的密鑰時使用。
/dev/urandom(「unblocked」,非阻塞的隨機數發生器),它會重復使用熵池中的數據以產生偽隨機數據。這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。它可以作為生成較低強度密碼的偽隨機數生成器,不建議用於生成高強度長期密碼。
FreeBSD操作系統實現了256位的Yarrow演算法變體,以提供偽隨機數流。與Linux的/dev/random不同,FreeBSD的/dev/random不會產生阻塞,與Linux的/dev/urandom相似,提供了密碼學安全的偽隨機數發生器,而不是基於熵池。而FreeBSD的/dev/urandom則只是簡單的鏈接到了/dev/random。
OpenSSL的提供了RAND_bytes方法生成隨機數。在使用之前需要使用RAND_add向PRNG中添加種子及熵值。種子可以通過TSC生成。
CryptoAPI提供了CryptGenRandom方法產生隨機數。CryptGenRandom已經被廢棄,應該使用新版CNG API:BCryptGenRandom
CPU指令rdrand從晶元的硬體隨機數生成器中獲取隨機數
32位:
64位:
BTC採用了多種方式混合的形式,將OpenSSL隨機數生成、OS隨機數生成、硬體隨機數生成再混淆隨機數發生器的狀態來生成強隨機數。
參考文檔:
https://en.wikipedia.org/wiki/Random_number_generation#%22True%22_vs._pseudo-random_numbers
https://zh.wikipedia.org/wiki//dev/random
https://www.openssl.org/docs/man1.0.2/crypto/RAND_seed.html
https://zh.wikipedia.org/zh-hans/RdRand
8. 比特幣的加密(秘鑰、地址、腳本驗證)
https://en.bitcoin.it/wiki/Address
https://www.cnblogs.com/zhaoweiwei/p/address.html
生成方式:
P2PKH的交易腳本
舉個真實的例子:
ScriptSig:
PUSHDATA(72)[9701] PUSHDATA(33)
[]
這裡面的一個scriptSig由2部分組成,第一部分是簽名,第二部分是公鑰,PUSHDATA(N),表示要壓入棧頂的byte,1個byte表示2個字元,PUSHDATA(72)表示壓入144個字元
Output Scripts
HASH160 PUSHDATA(20)[] EQUAL
DUP HASH160 PUSHDATA(20)[] EQUALVERIFY CHECKSIG
第二個找零output地址因為是P2PKH開頭的,所以格式和描述的一樣
https://www.hibtc.org/2428.html
結合多重簽名一起使用
scriptSig: ..signatures... <serialized script>
scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL
表示一共有n個參與方,只要有m個參與方同意了這筆交易,則這筆交易就生效了,具體的規則是通過scriptHash裡面的腳本內容決定的
m-of-n multi-signature transaction:
scriptSig: 0 <sig1> ... <script>
script: OP_m <pubKey1> ... OP_n OP_CHECKMULTISIG
ScriptSig:
0[] PUSHDATA(72)[1201] PUSHDATA(71)[01] PUSHDATA1[]
HASH160 PUSHDATA(20)[] EQUAL
結合P2SH的新特徵
https://en.bitcoin.it/wiki/Transaction
目前比特幣支持兩種類型的交易:Pay-to-PubkeyHash、Pay-to-Script-Hash
驗證一筆P2PKH交易的一個輸入是否合法:
總結:先驗證這筆output是不是屬於該用戶,再驗證該用戶的簽名是否有效
參考:
https://blog.csdn.net/jerry81333/article/details/56824166
初級版的比特幣交易
https://www.jianshu.com/p/a57795ec562c
9. 比特幣基礎教學之:怎樣保護你的私鑰
私鑰安全問題的重要性對比特幣玩家來說不言而喻。對於比特幣的重量級玩家或者比特幣商家而言,如何保護好私鑰更是需要仔細考慮和反復斟酌的。今天編者就和大家探討一下如何保護比特幣私鑰的問題。對於bitcoin-qt客戶端來說,比特幣私鑰一般儲存在客戶端的wallet.dat文件中。對於Blockchain這樣的在線錢包用戶來說,比特幣私鑰是儲存在在線錢包的網路伺服器上,用戶也可以將私鑰下載到本地。對於紙錢包的用戶來說,私鑰可以被列印出來。但是,怎樣保護私鑰的安全性呢?編者列出了幾種方法供大家參考。
用對稱加密的方法保管私鑰 對稱加密(Symmetric-key algorithm)是指加密和解密都用一個密鑰。我們平時用到的加密方法一般都是對稱加密,比如 winrar 中的加密,bitcoin-qt中對私鑰文件的加密也是用的對稱型加密演算法。常用的對稱加密演算法有:AES、DES、RC4、RC5等等。對稱加密需要用戶設置相對比較復雜的密鑰,以防止被暴力破解。Go to top方法一,用bitcoin-qt對私鑰錢包進行加密。我們在命令模式下可以用encryptwallet命令來對錢包進行加密。命令模式的使用方法可以參見比特幣基礎教學之:怎樣使用紙錢包私鑰。這是私鑰加密的最簡易有效的方法。但是在使用walletpassphrase命令進行解密錢包時,密鑰會被讀入計算機內存中,所以存在攻擊者獲取密鑰的可能性。加密命令: encryptwallet YOURPASSWORD解密錢包命令: walletpassphrase YOURPASSWORDTIMEOUT更改密碼命令: walletpassphrasechange OLDPASSWORDNEWPASSWORDGo to top方法二,使用blockchain提供的AES加密。Blockchain為用戶提供基於AES演算法的私鑰文件加密服務。用戶可以將加密好的文件下載下來,並妥善保存。
Go to top方法三,用第三方軟體Truecrypt對密鑰文件加密,這也是編者比較推薦的方法。Truecrypt開源免費,軟體成熟度很高,而且支持雙因素認證和整個硬碟加密。另外,FBI人員在Truecrypt上面吃過虧,因此口碑很不錯。Truecrypt的口碑FBI hackers fail to crack TrueCrypt The FBI has admitted defeat in attempts to break the open source encryption used to secure hard drives seized by Brazilian police ring a 2008 investigation.
The Bureau had been called in by the Brazilian authorities after the country』s own National Institute of Criminology (INC) had been unable to crack the passphrases used to secure the drives by suspect banker, Daniel Dantas.Brazilian reports state that two programs were used to encrypt the drives, one of which was the popular and widely-used free open source program TrueCrypt. Experts in both countries apparently spent months trying to discover the passphrases using a dictionary attack, a technique that involves trying out large numbers of possible character combinations until the correct sequence is found.
完整文章點擊這里Truecrypt只支持對稱加密演算法。使用它的用戶必須要將密鑰牢記,如果你忘記密鑰,那麼沒有人能夠恢復你加密的文件。
Truecrypt官方網站Truecrypt使用文檔 用非對稱加密的方法保管私鑰 非對稱加密方法所採用公鑰和私鑰的形式來對文件進行加密。用戶可以用公鑰來對文件進行加密,用私鑰對文件解密。常見的非對稱加密演算法有RSA、Elgamal、ECC等等。非對稱加密的好處是密鑰的復雜度一般很高,可以很有效的防止被暴力破解。缺點是有一定的使用門檻,不太適合普通級用戶。Go to top 方法一、個人用戶可以考慮使用RSA來進行加密。首先,可以創建公鑰和私鑰,點擊這里生成密鑰。將公鑰私鑰妥善保管後,便可以用公鑰加密和私鑰解密了,點擊這里進行加密和解密。RSA公鑰和私鑰的產生過程RSA公鑰和私鑰的產生過程隨意選擇兩個大的素數p和q,p不等於q,計算N=pq。根據歐拉函數,求得r= φ(N) = φ(p)φ(q) = (p-1)(q-1)選擇一個小於r的整數e,求得e關於模r的模反元素,命名為d。(模反元素存在,當且僅當e與r互質)將p和q的記錄銷毀。(N,e)是公鑰,(N,d)是私鑰。Go to top方法二、比較成熟的非對稱加密軟體有我們可以採用PGP(Pretty Good Privacy)工具來對文件進行加密。PGP加密可以讓每個公鑰邦定到一個用戶的所有信息。相比RSA來講,PGP的功能更加完善可靠。但是隨著PGP的升級,新的加密消息有可能不被舊的PGP系統解密,所以用戶在使用PGP之前應該首先熟悉PGP的設置。PGP加密工具網上有很多,編者就不列舉了。
wiki中關於PGP的介紹PGP在線加解密系統PGP命令FAQ 高級方法保管私鑰 上述保管私鑰的方式都很常見,有經驗的攻擊者依然可能得到用戶的私鑰文件。關於更加高級隱秘的私鑰保管方式,參見以後的比特幣高級教學內容。
10. 我了解到生成比特幣地址的十個步驟, 求問:第一步生成私鑰是隨機生成呢,還是根據你的比特幣數量信息
礦工你好