【发布时间】:2021-11-15 15:20:13
【问题描述】:
大家好,
我想我错过了什么。我使用 openSSL 生成了一个私钥和公钥对。 使用的线路:
openssl ecparam -name secp256k1 -genkey -noout -out priv_key.pem
openssl ec -in .\priv_key.pem -pubout -out public_key.pem
这给了我我的密钥对。例如这个 私钥:
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIOBYwBnXMgYHsRSv99H4zgtzSClALIcNBN97QbBPNFzHoAcGBSuBBAAK
oUQDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuNbA0JilgF4+T8ruuWl16vrOrI
3dSDDfsafxatLS3BytvtmyOQxye98Q==
-----END EC PRIVATE KEY-----
公钥:
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuN
bA0JilgF4+T8ruuWl16vrOrI3dSDDfsafxatLS3BytvtmyOQxye98Q==
-----END PUBLIC KEY-----
我正在尝试使用 mbedtls_pk_parse_public_key 将我的公钥解析为 pk_context。我的代码如下所示:
int32_t s32Err = 0;
mbedtls_pk_init(&pk);
int32_t tempsize = strlen(ecdsaPublic);
s32Err = mbedtls_pk_parse_public_key(&pk, ecdsaPublic, tempsize + 1);
我的公钥 (ecdsaPublic) 被复制/粘贴并格式化如下:
const char* ecdsaPublic = "-----BEGIN PUBLIC KEY-----\n"
"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuN\n"
"bA0JilgF4+T8ruuWl16vrOrI3dSDDfsafxatLS3BytvtmyOQxye98Q==\n"
"-----END PUBLIC KEY-----\n";
如果我现在让它运行,我会在 s32Err 中得到 0xFFFFFFF0 作为错误代码。可悲的是,我在图书馆的任何地方都找不到这个错误代码,或者我没有在正确的地方搜索。
如果我用另一个公钥尝试完全相同的代码,比如这个:
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMALAAUWI7loxRd++n5VG+E6gl1NEC8Z
yQmtyzKEdwwJ+qrC9BSi6f5FmutbJYqu1wR6QitVCEXUrtN1rOBCQ78CAwEAAQ==
-----END PUBLIC KEY-----
解析返回0。
有没有人有想法或提示? 我的密钥生成错误吗?
最良好的祝愿和感谢您的帮助和建议!
马克
【问题讨论】:
-
为什么是
tempsize + 1? -
我需要带有尾随
\0的整个字符串。这就是我添加tempsize + 1的原因。我添加了变量tempsize来查看我传递给函数mbedtls_pk_parse_public_key的大小。 -
s32Err是有符号整数,所以是-16,在mbedtls/bignum.h中写为-0x0010。如果您在本机构建 mbedtls,则可以运行programs/util/strerror -16。其实programs/util/strerror 0xfffffff0也可以。 -
@Gilles'SO-stopbeingevil' 你是绝对正确的。我将此信息添加到我的答案中!
标签: c cryptography mbedtls