我如何在使用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 PRIVATE KEY
。
我现在想做的是使用我的私钥加密hash
中包含的消息,以便只有公钥才能解密。通过以上代码是否可能实现这一目标,或者我完全走错了方向?
hash
应该指向一个合适的哈希值,通常为20字节(对于SHA1)或24到64字节(对于SHA2),但在C语言中,sizeof(hash)
是指针的大小,通常为4或8字节,而不是指向的对象的大小。此外,ECDSA签名与大多数其他现代加密对象一样,都是任意位数(也称为“二进制”),可以有效地包含所有零比特,但不可靠地跟随一个,这使得将其处理为空终止的C字符串无效,而printf %s
则试图这样做,通常还包括不安全可打印的字节。... - dave_thompson_085