我想使用ecdsa的基本函数:keygen\sign\verify。在阅读文档openssl/ecdsa之后
我这样写:
#include <openssl/ecdsa.h>
#include <openssl/sha.h>
#include <openssl/obj_mac.h> // for NID_secp192k1\
#include <stdio.h>
int main(int argc, char **argv){
int ret;
ECDSA_SIG *sig;
EC_KEY *eckey;
eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_generate_key(eckey);
sig = ECDSA_SIG_new();
if (eckey == NULL)
printf("err1");
unsigned char dgst[] = "test";
unsigned char res[32];
SHA256(dgst, 32, res);
for (int i = 0; i < 32; i++)
{
printf("%02x", res[i]);
}
sig = ECDSA_do_sign(res, 32, eckey);
if (sig == NULL)
printf("err\n");
printf("\n");
ret = ECDSA_do_verify(res, 32, sig, eckey);
printf("%d\n", ret);
}这段代码起作用了。但是,在ECDSA_do_Verify中,输入是eckey,包括公钥和私钥。但我只想使用pubkey来验证。那么我该如何实现这个目标呢?
任何帮助都将不胜感激。
发布于 2021-04-17 13:25:30
#include <openssl/x509.h>
...
unsigned char *ptr = NULL;
int n = i2d_EC_PUBKEY (eckey, &ptr); // 'export' a representation of the publickey
const unsigned char *copy = ptr;
EC_KEY * ecpub = d2i_EC_PUBKEY (NULL, ©, n); // 'import' it to a new object
OPENSSL_free (ptr); // for real code, not needed for a test hack like yours当然,在实际的应用程序中,您需要将密钥对存储在某个位置,并可能获得公钥的证书,前者和后者肯定已经提供了一个外部化的公钥供回读。
PS:我忘了说,你正在使用一个32字节的缓冲区dgst作为SHA256()的输入,但是dgst只有5个字节,所以这在技术上是未定义的行为(可以做任何事情),实际上可能会使用dgst之后内存中碰巧出现的任何随机垃圾,这会使你的结果无法重现和验证。
https://stackoverflow.com/questions/67134691
复制相似问题