【发布时间】:2010-02-09 12:11:22
【问题描述】:
在 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 中包含的消息,这样只有公钥才能解密它。上面的代码有可能吗,还是我这样做完全错了?
【问题讨论】:
-
正确的术语是“签名”。 “加密”这个词是为其他东西保留的。你没有提到你遇到了什么问题。
-
啊,对不起。那么在上面的代码中,sn -p 私钥没有在任何地方使用?还是仅在设计消息时才需要这样做?
-
注意,使用私钥加密实际上称为“签名”。任何人持有对应的公有一半都会解密结果(其实就是所谓的“验证”)
-
迟但:
hash这里应该指向一个合适的哈希值,通常是 20 字节(对于 SHA1)或 24 到 64 字节(对于 SHA2),但在 C 中sizeof(hash)的大小是指针,通常为 4 或 8 个字节,而不是所指向事物的大小。此外,与大多数其他现代加密对象一样,ECDSA 签名是任意位(又名“二进制”),并且可以有效地包含一个全 0 位字节,但不能可靠地跟随一个字节,这使得将其作为空值处理是无效的-printf %s试图做的终止的 C 字符串,以及通常包括不能安全打印的字节。 ... -
... 和 RSA 签名和验证 相似 但实际上不是“用私钥加密”和“用公钥解密”,而是在ECDSA(和 DSA)甚至没有任何类似于加密和解密的东西,只有 签名和验证。
标签: c encryption openssl elliptic-curve