我正在用C++编写简单的代码,使用OpenSSL来生成有效的比特币地址-私钥对。
我使用这个片段从给定的十六进制形式的私钥生成公钥:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
#include <openssl/bn.h>
int main()
{
EC_KEY *eckey = NULL;
EC_POINT *pub_key = NULL;
const EC_GROUP *group = NULL;
BIGNUM start;
BIGNUM *res;
BN_CTX *ctx;
BN_init(&start);
ctx = BN_CTX_new(); // ctx is an optional buffer to save time from allocating and deallocating memory whenever required
res = &start;
BN_hex2bn(&res,"30caae2fcb7c34ecadfddc45e0a27e9103bd7cfc87730d7818cc096b1266a683");
eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
group = EC_KEY_get0_group(eckey);
pub_key = EC_POINT_new(group);
EC_KEY_set_private_key(eckey, res);
/* pub_key is a new uninitialized `EC_POINT*`. priv_key res is a `BIGNUM*`. */
if (!EC_POINT_mul(group, pub_key, res, NULL, NULL, ctx))
printf("Error at EC_POINT_mul.\n");
EC_KEY_set_public_key(eckey, pub_key);
char *cc = EC_POINT_point2hex(group, pub_key, 4, ctx);
char *c=cc;
int i;
for (i=0; i<130; i++) // 1 byte 0x42, 32 bytes for X coordinate, 32 bytes for Y coordinate
{
printf("%c", *c++);
}
printf("\n");
BN_CTX_free(ctx);
free(cc);
return 0;
}
字符串
我想要的是将这个公钥转换为比特币地址-最快的方法是什么?我不知道如何从OpenSSL的BIGNUM创建RIPEMD 160。或许还有其他更好的解决方案?
3条答案
按热度按时间s4chpxco1#
假设你正在做的是基于这个转换:
的数据
我将描述你可以在伪代码中做些什么:
首先从公钥中提取x,y。
字符串
接下来,您需要多次执行消息摘要,包括3次sha256和1次ripemd160。在下面的伪代码中,我将向您展示如何执行ripemd160。要使用EVP_MD执行sha256,只需将
EVP_ripemd160()
替换为EVP_sha256()
,并使用单个或多个EVP_DigestUpdate()
更新(输入到EVP_MD)您的输入消息。型
或者更简单的方法,直接调用
sha256()
和ripemd160()
。但是在调用哈希函数sha256()
或ripemd160()
之前,需要准备好输入消息。25字节二进制地址是ripemd160的结果,加上32字节校验和的前4个字节。您需要找到一种方法将其从Base 256转换为Base 58。我不认为OpenSSL支持这个。
rbl8hiat2#
25字节二进制地址是ripemd160的结果,加上32字节校验和的前4个字节。您需要找到一种方法将其从Base 256转换为Base 58。我不认为OpenSSL支持这个。https://drive.google.com/file/d/1bL52hFkZg9L2jIPdhEKw35ooFK78w1qm/view?usp=sharing
dba5bblo3#
好了,重写了一些步骤,从上面的代码片段中生成私钥
字符串