openssl读取秘钥文件,提取EC私钥

/*

  • engineTester.c
  • Created on: Sep 29, 2015
  •  Author: oezgan
    

*/

/openssl/
#include <openssl/engine.h>
#include <openssl/crypto.h>
#include <openssl/evp.h>
#include <openssl/pem.h>

#include <stdio.h>
#include <string.h>

int main(int argc, const char* argv[] ) {

OpenSSL_add_all_algorithms();

ERR_load_crypto_strings();

ENGINE_load_dynamic();
ENGINE *oezgan_engine = ENGINE_by_id("oezgan");

if( oezgan_engine == NULL )
{
	printf("Could not Load Oezgan Engine!\n");
	exit(1);
}
printf("Oezgan Engine successfully loaded\n");

int init_res = ENGINE_init(oezgan_engine);
printf("Engine name: %s init result : %d \n",ENGINE_get_name(oezgan_engine), init_res);
ENGINE_set_default_RAND(oezgan_engine);

unsigned char * rand_buf= new unsigned char[5];
int err = RAND_bytes(rand_buf,5);
for(int i= 0; i < 5; i++) {
	printf("%x",rand_buf[i]);
}
printf("\n");

char * str = "Fraunhofer FKIE Wachtberg!";
int str_len =  26;
int er = ENGINE_set_default_digests(oezgan_engine);
printf("ENGINE SETTING DEFAULT DIGESTS %d\n",er);

unsigned char * digest = new unsigned char[32];
unsigned int digestSize = -1;

EVP_MD_CTX *evp_ctx;
evp_ctx = EVP_MD_CTX_create();
er = EVP_DigestInit_ex(evp_ctx, EVP_sha256(),oezgan_engine);
printf("Digest INIT %d\n",er);
er = EVP_DigestUpdate(evp_ctx, (unsigned char*)str, str_len);
printf("Digest Update %d\n",er);
er = EVP_DigestFinal(evp_ctx, digest, &digestSize);
printf("Digest Final %d Digest size:%d\n",er,digestSize);
for(int i= 0; i< digestSize; i++) {
	printf("%x", digest[i]);
}
printf("\n");
EVP_MD_CTX_destroy(evp_ctx);

er = ENGINE_set_default_ECDH(oezgan_engine);
printf("ENGINE SETTING DEFAULT ECDH %d\N ",er);

FILE* fp = fopen("./ownPrivkey.pem", "r");
if (fp == NULL) {
	printf( "Could not open private key file\N");
	exit(1);
}
EVP_PKEY *privateKey;
privateKey= PEM_read_PrivateKey(fp, NULL, 0, NULL);
if ((privateKey) == NULL) {
	printf("Could not extract private key from file\N");
	exit(1);
}
fclose(fp);

EC_KEY *eckey;
eckey = EC_KEY_new();
ECDSA_SIG * ecdsa_sig;
ecdsa_sig = ECDSA_SIG_new();
eckey = EVP_PKEY_get1_EC_KEY(privateKey);

EC_GROUP *ec_group;
ec_group = EC_GROUP_new_by_curve_name(NID_brainpoolP384r1);
const EC_POINT* pub_key;
pub_key = EC_KEY_get0_public_key(eckey);



unsigned char agreed_value[200];
EC_KEY *ecdh;
ecdh = EC_KEY_new();
EC_KEY_set_group(ecdh, ec_group);
er = EC_KEY_set_private_key(ecdh, EC_KEY_get0_private_key(eckey));



int agreed_value_len = ECDH_compute_key(agreed_value, 200,pub_key, ecdh, NULL);

printf("Oezgan engine Agreed Value: %d\n",agreed_value_len);
for(int i= 0; i < agreed_value_len; i++) {
	printf("%x", agreed_value[i]);
}
printf("\n");

er = ENGINE_set_default_ECDSA(oezgan_engine);
printf("\nENGINE SETTING DEFAULT ECDSA:%d\n",er);

unsigned char *sig = new unsigned char[256];
unsigned int sigsize;
ECDSA_sign(0,digest,digestSize,sig,&sigsize,eckey);
printf("Signature size:%d \n",sigsize);
for(int i=0; i <sigsize;i++) {
	printf("%x",sig[i]);
}
printf("\n");
printf("Now verifying!\n");

BIO* bio_in;
bio_in = BIO_new_file("./ownCert.pem", "r");
if (bio_in == NULL) {
	printf("could not read public key file\n");
	exit(1);

}
X509 *certificate;
certificate = X509_new();
if (PEM_read_bio_X509(bio_in, &certificate, 0, NULL) == NULL) {
	printf("could not read  certificate from public key file\n");
	exit(1);
}
EVP_PKEY *pubKey;
pubKey = X509_get_pubkey(certificate);
EC_KEY* eckey_pub;
eckey_pub = EVP_PKEY_get1_EC_KEY(pubKey);

int	result = ECDSA_do_verify(digest, digestSize,
		ecdsa_sig, eckey_pub);
printf("Verify result %d\n", result);


EC_KEY_free(eckey);
EC_GROUP_free(ec_group);
EC_KEY_free(ecdh);
X509_free(certificate);
BIO_free_all(bio_in);

free(rand_buf);
return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用gmssl库从.key文件读取SM2私钥的过程中,需要注意的是SM2私钥是以ECParameters格式存储的,因此在读取私钥前需要先设置好椭圆曲线参数。具体的代码实现如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/pem.h> #include <openssl/evp.h> #include <openssl/err.h> #include <openssl/gmssl.h> int main() { EVP_PKEY *pkey = NULL; BIO *bio = NULL; FILE *file = NULL; char *key_name = "private_key.key"; // 私钥文件名 // 打开私钥文件 file = fopen(key_name, "r"); if (file == NULL) { printf("Failed to open private key file %s\n", key_name); return -1; } // 读取私钥 pkey = PEM_read_bio_PrivateKey(file, NULL, NULL, NULL); if (pkey == NULL) { printf("Failed to read private key from file %s\n", key_name); return -1; } // 关闭文件 fclose(file); // 设置SM2曲线参数 EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_sm2); if (group == NULL) { printf("Failed to create SM2 group\n"); return -1; } EVP_PKEY_set1_EC_KEY(pkey, EC_KEY_new()); EC_KEY_set_group(EVP_PKEY_get1_EC_KEY(pkey), group); // 使用私钥进行加密/解密等操作 // 释放资源 EC_GROUP_free(group); EVP_PKEY_free(pkey); return 0; } ``` 其中,`PEM_read_bio_PrivateKey`函数可以从文件读取私钥,返回一个`EVP_PKEY`类型的结构体指针。在读取私钥后,需要设置SM2曲线参数,使用`EVP_PKEY_set1_EC_KEY`函数和`EC_KEY_set_group`函数实现。在使用完私钥后,需要调用`EVP_PKEY_free`函数释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值