我想通过OpenSSL从NSData创建一个EC_Key。所以我写下以下内容:
- (void)setPrivateKey:(NSData *)privateKey {
const unsigned char *bits = (unsigned char *) [privateKey bytes];
eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_set_group(eckey, ec_group);
EC_KEY_generate_key(eckey);
EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
eckey = d2i_ECParameters(&eckey, &bits, privateKey.length);
}
但是
eckey = d2i_ECParameters(&eckey, &bits, privateKey.length);
返回null。
有什么问题?
答案 0 :(得分:1)
感谢@jww的精彩评论,最后,我通过以下代码块成功解决了这个问题
- (void)setPrivateKey:(NSData *)privateKey {
const unsigned char *privateKeyBits = (unsigned char *) [privateKey bytes];
ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
eckey = EC_KEY_new();
EC_KEY_set_group(eckey, ec_group);
EC_KEY_generate_key(eckey);
EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
BIGNUM *prv = BN_bin2bn(privateKeyBits, sizeof(privateKeyBits), NULL);
EC_KEY_set_private_key(eckey, prv);
EC_POINT *pub = EC_POINT_new(ec_group);
EC_POINT_mul(ec_group, pub, prv, NULL, NULL, NULL);
EC_KEY_set_public_key(eckey, pub);
pkey = EVP_PKEY_new();
EVP_PKEY_set1_EC_KEY(pkey, eckey);
}
虽然我有公钥和私钥,但是上面的代码我从私钥计算了公钥。