在 OpenSSL 中使用 ECDSA 对消息进行签名
以编程方式在 OpenSSL 中使用 ECDSA 时,如何设置用于签名消息的私钥?我有以下代码:
static int create_signature(unsigned char* hash)
{
EC_KEY *eckey=NULL;
EC_GROUP *ecgroup=NULL;
EVP_PKEY *evpkey=NULL;
unsigned char *signature=NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int signature_size, block_size;
unsigned char * block=NULL;
ecgroup = get_ec_group_192();
EC_GROUP_set_asn1_flag(ecgroup, OPENSSL_EC_NAMED_CURVE);
EC_GROUP_set_point_conversion_form(ecgroup, form);
eckey=EC_KEY_new();
EC_KEY_set_group(eckey,ecgroup);
EC_KEY_generate_key(eckey);
evpkey=EVP_PKEY_new();
EVP_PKEY_assign_EC_KEY(evpkey,eckey);
signature=OPENSSL_malloc(EVP_PKEY_size(evpkey));
ECDSA_sign(0, hash, sizeof(hash), signature, &signature_size, eckey);
printf("%s", signature);
return 0;
}
函数 get_ec_group_192()
是通过运行 openssl ecparam -C -name secp192k1 -genkey
创建的,它还会生成一些 EC PARAMETERS
> 和 EC 私钥
。
我想做的是用我的私钥加密 hash
中包含的消息,以便只有公钥可以解密它。上面的代码是否可以做到这一点,或者我这样做完全是错误的?
How do I set the private key for signing messages when using ECDSA in OpenSSL programmatically? I have the following code:
static int create_signature(unsigned char* hash)
{
EC_KEY *eckey=NULL;
EC_GROUP *ecgroup=NULL;
EVP_PKEY *evpkey=NULL;
unsigned char *signature=NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int signature_size, block_size;
unsigned char * block=NULL;
ecgroup = get_ec_group_192();
EC_GROUP_set_asn1_flag(ecgroup, OPENSSL_EC_NAMED_CURVE);
EC_GROUP_set_point_conversion_form(ecgroup, form);
eckey=EC_KEY_new();
EC_KEY_set_group(eckey,ecgroup);
EC_KEY_generate_key(eckey);
evpkey=EVP_PKEY_new();
EVP_PKEY_assign_EC_KEY(evpkey,eckey);
signature=OPENSSL_malloc(EVP_PKEY_size(evpkey));
ECDSA_sign(0, hash, sizeof(hash), signature, &signature_size, eckey);
printf("%s", signature);
return 0;
}
The function get_ec_group_192()
is created by running openssl ecparam -C -name secp192k1 -genkey
which also generates some EC PARAMETERS
and a EC PRIVATE KEY
.
What I am trying to do is to encrypt the message contained in hash
with my private key so that only public key can decrypt it. Is that possible with the above code, or am I doing this completely wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
以下对我来说验证成功:
The following verifies successfully for me:
这是上面代码中的一个小错误。传递的散列是一个无符号字符,该散列中可以有 0x00 值!不要使用 strlen(hash) 来计算长度,因为如果散列中的任何位置都有 0x00,则可能会将不正确的长度传递给例程。哈希值是固定长度的,应该这样传递。例如,sha256 的长度应为 64。
Their is a small bug in the above code. The hash that is passed is an unsigned char, this hash CAN have 0x00 values in it! Do NOT use the strlen(hash) to calculate the length, as that will possibly pass the incorrect length to the routine IF the hash has a 0x00 in it anywhere. Hashes are fixed length, and should be passed as such. sha256 for example should be of length 64.