我拥有压缩的公共密钥,并希望将其转换为未压缩的公共密钥。那就是我得到钥匙的方式:
EC_KEY *key_pair_obj = nullptr;
BIGNUM *priv_key;
EC_POINT *pub_key;
EC_GROUP *secp256k1_group;
char *priv_key_char;
char *pub_key_char;
char *pub_key_char_comp;
int ret_error;
// Generate secp256k1 key pair
key_pair_obj = EC_KEY_new_by_curve_name(NID_secp256k1);
ret_error = EC_KEY_generate_key(key_pair_obj);
// Get private key
priv_key = (BIGNUM *)EC_KEY_get0_private_key(key_pair_obj);
priv_key_char = BN_bn2hex(priv_key);
// Get public key
pub_key = (EC_POINT *)EC_KEY_get0_public_key(key_pair_obj);
secp256k1_group = EC_GROUP_new_by_curve_name(NID_secp256k1);
pub_key_char = EC_POINT_point2hex(secp256k1_group, pub_key, POINT_CONVERSION_UNCOMPRESSED, nullptr);
EC_GROUP_free(secp256k1_group);
printf("Private key : %s\n\n", priv_key_char);
printf("Public key uncomp. : %s\n", pub_key_char_comp);
我知道我可以使用:
pub_key_char_comp = EC_POINT_point2hex(secp256k1_group, pub_key, POINT_CONVERSION_COMPRESSED, nullptr);
...但是我想稍后进行转换。我该怎么办?
答案 0 :(得分:0)
问题的文本从标题和示例向后。假设后者:
给出素点曲线上的公共点(或实际上任何点)的未压缩形式的十六进制表示,例如secp256k1,其形式为
u = "04xxxxxxxxyyyyyyyy" // with lengths depending on curve's field
要创建压缩形式的十六进制表示,请执行以下操作:
int k = strlen(u)/4; // hexit-pairs (value bytes) of each coordinate
// or use known constant for curve e.g. 32 for secp256k1
char * c = malloc (k*2+2+1); // error handling needed but depends on program
memcpy (c+2, u+2, k*2); // copy x
memcpy (c, u[k*4+1] & 1? "03": "02", 2); // set first byte per low bit of y
c[k*2+2] = '\0'; // string terminator
或者,如果您不需要保留未压缩的表单,则可以更简单地重用其OpenSSL_malloc的空间(尽管浪费了其中的一部分):
u[1] = '2' | u[k*4+1] & 1;
// leave u[0] and u[2..k*2+1] alone
u[k*2+2] = '\0';