比特幣使用橢圓曲線算法生成公鑰和私鑰,選擇的是secp256k1曲線。生成的公鑰是33字節的大數,私鑰是32字節的大數,錢包文件wallet.dat中直接保存了公鑰和私鑰。我們在接收和發送比特幣時用到的比特幣地址是公鑰經過算法處理後得到的,具體過程是公鑰先經過SHA-256算法處理得到32字節的哈希結果,再經過RIPEMED算法處理後得到20字節的摘要結果,再經過字符轉換過程得到我們看到的地址。這個字符轉換過程與私鑰的字符轉換過程完成相同,步驟是先把輸入的內容(對於公鑰就是20字節的摘要結果,對於私鑰就是32字節的大數)增加版本號,經過連續兩次SHA-256算法,取後一次哈希結果的前4字節作為校驗碼附在輸入內容的後面,然後再經過Base58編碼,得到字符串。
這裡需要提一下的是Base58編碼為了讓輸出字符串易於辨別,所以編碼時故意排除了4個字符:'0'、'I'、'l'、'O',如果你想生成一個帶特殊詞綴的地址那就不要帶這4個符了,比如我的ID(walker)也就不能生成了。