pem 格式的私有 RSA、DSA 或 ECDSA 密钥是否包含 public 密钥?
Does private RSA, DSA or ECDSA key in pem-format contain public key?
我使用硬编码的 ec-kyes 来测试我的应用程序。
有 ecdsa 的例子:
const char pem_ecdsa_prv_key[] = {
"-----BEGIN EC PRIVATE KEY-----\n"
"MHcCAQEEIAGOaT3/9PJxSIFKPbvEhj61jY3CGPsgA46IVZlvIlnGoAoGCCqGSM49\n"
"AwEHoUQDQgAE6Dw87+AYjRQzNsb3RmANmNENCZArERfCKZ5M9+2S/yomA6fmFdeb\n"
"XNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
"-----END EC PRIVATE KEY-----\n"
};
const char pem_ecdsa_pub_key[] = {
"-----BEGIN PUBLIC KEY-----\n"
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6Dw87+AYjRQzNsb3RmANmNENCZAr\n"
"ERfCKZ5M9+2S/yomA6fmFdebXNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
"-----END PUBLIC KEY-----\n"
};
它是使用 help ssh-keygen 实用程序生成的。
我需要将此 pem 字符串转换为 openssl EC_KEY 格式,以便将其与 sign/verify openssl 函数一起使用。
我是这样转换的(省略了错误检查):
EC_KEY *ecdsa = NULL;
BIO *bio= NULL;
/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_prv_key,sizeof(pem_ecdsa_prv_key));
/* convert bio to ec_key */
ecdsa = EC_KEY_new();
PEM_read_bio_ECPrivateKey(bio, &ecdsa, NULL, NULL);
现在我为 pem_ecdsa_prv_key
和 pem_ecdsa_pub_key
进行此转换。
我应该只对私钥数组执行此操作,因为它也包含 public 密钥吗?
您以完全相同的方式加载 public 密钥,但您使用 PEM_read_bio_EC_PUBKEY 而不是 PEM_read_bio_ECPrivateKey。
例如
/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_pub_key,sizeof(pem_ecdsa_pub_key));
/* convert bio to ec_key */
ecdsa = PEM_read_bio_EC_PUBKEY(bio, NULL, NULL, NULL);
(注意,您不需要在 PEM_read_bio_EC_PUBKEY 或 PEM_read_bio_ECPrivateKey 调用中先分配 EC_KEY)
此外,私钥通常包含public key。如果加载私钥,则可以对所有私钥/public 密钥用法使用 EC_KEY。如果加载 public 密钥,则只能将其用于 public 密钥用法。
我使用硬编码的 ec-kyes 来测试我的应用程序。 有 ecdsa 的例子:
const char pem_ecdsa_prv_key[] = {
"-----BEGIN EC PRIVATE KEY-----\n"
"MHcCAQEEIAGOaT3/9PJxSIFKPbvEhj61jY3CGPsgA46IVZlvIlnGoAoGCCqGSM49\n"
"AwEHoUQDQgAE6Dw87+AYjRQzNsb3RmANmNENCZArERfCKZ5M9+2S/yomA6fmFdeb\n"
"XNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
"-----END EC PRIVATE KEY-----\n"
};
const char pem_ecdsa_pub_key[] = {
"-----BEGIN PUBLIC KEY-----\n"
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6Dw87+AYjRQzNsb3RmANmNENCZAr\n"
"ERfCKZ5M9+2S/yomA6fmFdebXNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
"-----END PUBLIC KEY-----\n"
};
它是使用 help ssh-keygen 实用程序生成的。 我需要将此 pem 字符串转换为 openssl EC_KEY 格式,以便将其与 sign/verify openssl 函数一起使用。 我是这样转换的(省略了错误检查):
EC_KEY *ecdsa = NULL;
BIO *bio= NULL;
/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_prv_key,sizeof(pem_ecdsa_prv_key));
/* convert bio to ec_key */
ecdsa = EC_KEY_new();
PEM_read_bio_ECPrivateKey(bio, &ecdsa, NULL, NULL);
现在我为 pem_ecdsa_prv_key
和 pem_ecdsa_pub_key
进行此转换。
我应该只对私钥数组执行此操作,因为它也包含 public 密钥吗?
您以完全相同的方式加载 public 密钥,但您使用 PEM_read_bio_EC_PUBKEY 而不是 PEM_read_bio_ECPrivateKey。
例如
/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_pub_key,sizeof(pem_ecdsa_pub_key));
/* convert bio to ec_key */
ecdsa = PEM_read_bio_EC_PUBKEY(bio, NULL, NULL, NULL);
(注意,您不需要在 PEM_read_bio_EC_PUBKEY 或 PEM_read_bio_ECPrivateKey 调用中先分配 EC_KEY)
此外,私钥通常包含public key。如果加载私钥,则可以对所有私钥/public 密钥用法使用 EC_KEY。如果加载 public 密钥,则只能将其用于 public 密钥用法。