使用openssl生成ECDSA密钥对时的额外字符

使用openssl生成ECDSA密钥对时的额外字符,openssl,Openssl,我想使用openSSL库为ECDSA算法生成公钥/私钥对。问题是在生成密钥对之后,在生成的密钥中有一些额外的字符,完全没有意义。例如,下面是我的代码的结果: -----BEGIN EC PARAMETERS----- MIH3AgEBMCwGByqGSM49AQECIQD/////AAAAAQAAAAAAAAAAAAAAAP////////// /////zBbBCD/////AAAAAQAAAAAAAAAAAAAAAP///////////////AQgWsY12Ko6 k+ez671Vdpi

我想使用openSSL库为ECDSA算法生成公钥/私钥对。问题是在生成密钥对之后,在生成的密钥中有一些额外的字符,完全没有意义。例如,下面是我的代码的结果:

-----BEGIN EC PARAMETERS-----
MIH3AgEBMCwGByqGSM49AQECIQD/////AAAAAQAAAAAAAAAAAAAAAP//////////
/////zBbBCD/////AAAAAQAAAAAAAAAAAAAAAP///////////////AQgWsY12Ko6
k+ez671VdpiGvGUdBrDMU7D2O848PifSYEsDFQDEnTYIhucEk2pmeOETnSa3gZ9+
kARBBGsX0fLhLEJH+Lzm5WOkQPJ3A32BLeszoPShOUXYmMKWT+NC4v4af5uO5+tK
fA+eFivOM1drMV7Oy7ZAaDe/UfUCIQD/////AAAAAP//////////vOb6racXnoTz
ucrC/GMlUQIBAQ==
-----END EC PARAMETERS-----

-----BEGIN EC PRIVATE KEY-----
MIIBaAIBAQQgRcbK9JeWXghYJe0QHAaHDRrqmgX7Gp9QQrB820lHVDyggfowgfcC
AQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAAAAAAAAAAAAAA////////////////
MFsEIP////8AAAABAAAAAAAAAAAAAAAA///////////////8BCBaxjXYqjqT57Pr
vVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSdNgiG5wSTamZ44ROdJreBn36QBEEE
axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54W
K84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA//////////+85vqtpxeehPO5ysL8
YyVRAgEBoUQDQgAEiXKUR9yDAkmUUMj/i6LDxt0+HuMJRZWSbnq2fRZfHXgIkk9w
VFusGaX4keEJf9tOWUokEVNg1RMGfMjG9C8GUQ==
-----END EC PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MIIBSzCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAA
AAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA////
///////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSd
NgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5
RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA
//////////+85vqtpxeehPO5ysL8YyVRAgEBA0IABIlylEfcgwJJlFDI/4uiw8bd
Ph7jCUWVkm56tn0WXx14CJJPcFRbrBml+JHhCX/bTllKJBFTYNUTBnzIxvQvBlE=
-----END PUBLIC KEY-----
我使用BIO作为I/O,以下是我的代码:

EC_KEY *ecKey = EC_KEY_new();
if (ecKey == NULL) {
    // error happened in initializing new key pair
    return ERR_CODE_ECDSA_EC_KEY_NEW_EXCEPTION;
}

EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
if (group == NULL) {
    // error happened in generating new group
    return ERR_CODE_ECDSA_EC_GROUP_NEW_BY_CURVE_NAME_EXCEPTION;
}
EC_KEY_set_group(ecKey, group);

if (!EC_KEY_generate_key(ecKey)) {
    // error happened in generating new key pair
    return ERR_CODE_ECDSA_EC_KEY_GENERATE_KEY;
}

BIO* memBioECKey = BIO_new(BIO_s_mem());
if (memBioECKey == NULL) {
    return ERR_CODE_BIO_NEW_EXCEPTION;
}

int iRet = PEM_write_bio_ECPKParameters(memBioECKey, group);
if (!iRet) {
    return ERR_CODE_BIO_NEW_EXCEPTION;
}
iRet = PEM_write_bio_ECPrivateKey(memBioECKey, ecKey, NULL, NULL, 0, NULL, pchPassPhrase);
if (!iRet) {
    return ERR_CODE_BIO_NEW_EXCEPTION;
}

iRet = PEM_write_bio_EC_PUBKEY(memBioECKey, ecKey);
if (!iRet) {
    return ERR_CODE_BIO_NEW_EXCEPTION;
}

char* pchPriKey = NULL;
pchPriKey = new char[4096];
int iData = BIO_read(memBioECKey, pchPriKey, 4096);
strPrivateKey.assign(pchPriKey);
iPrivateKeyLen = strPrivateKey.length();
if (pchPriKey != NULL) {
    delete []pchPriKey;
    pchPriKey = NULL;
}

BIO_free_all(memBioECKey);
EC_KEY_free(ecKey);
ERR_print_errors_fp(stderr);

// Return NO_ERROR to indicate NO ERROR happens
return NO_ERROR;
知道问题出在哪里吗?我是否错误地使用了BIO API,或者使用顺序不正确


提前感谢

您认为有什么问题吗?这些是PEM编码的值。您可以使用
openssl ecparam-in[file]-text
解析第一个,使用
openssl ec-text-in[file]
解析第二个,使用
openssl asn1parse-in[file]
解析第三个。感谢您的评论。我不知道这是PEM中的编码值。因此,如何以编程方式从此类编码值检索EC参数、私钥和公钥?我想在char*中检索它们,并在网络上发送公钥。好吧,对于上面使用的每个PEM_写入函数,还有一个PEM_读取函数,它可以让您返回到EC_组/EC_密钥结构,您可以传输该结构的各个值。或者您可以发送整个PEM结构,让对等方调用PEM_read。向对等方传输公钥的标准方法是将密钥封装在X.509证书中,并使用TLS(当然,openssl可以帮助)。对于您的用例来说,这可能是过度杀戮;但是,如果没有,你就必须使用你自己的协议。谢谢你的回复。使用BIO和PEM_write的原因是提取char*格式的公钥和私钥。我在将BIGNUM转换为char*时遇到问题。我要做的就是将EC参数和EC私钥设置为char*格式。我可以稍后从中提取公钥。但是我不想要PEM的编码格式。知道如何提取纯密钥吗?