a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

博客專欄

EEPW首頁 > 博客 > openssl實踐-SM2國密算法簽名

openssl實踐-SM2國密算法簽名

發布人:電子禪石 時間:2025-02-25 來源:工程師 發布文章

Openssl自1.1.1版本以后,提供了對SM2國密算法的支持。

簽名算法基本流程
  1. 對數據進行摘要

  2. 使用私鑰對摘要進行加密運算(即簽名)

準備私鑰

跟據非對稱算法的原來,簽名用的是私鑰,所以簽名前必須先準備私鑰。私鑰的獲取有幾種方式

生成公私鑰
EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_sm2);    
int ec_ret = EC_KEY_generate_key(ec_key);

首先創建一個ec_key, 然后用EC_KEY_generate_key生成密鑰對。

從ec_key中提取私鑰

BIGNUM* pvk = EC_KEY_get0_private_key(ec_key);

從ec_key中提取公鑰

EC_POINT* point = EC_KEY_get0_public_key(ec_key);

可以看到私鑰和公鑰的類型并不相同,一個是BIGNUM,一個是EC_POINT

從PEM文件讀入私鑰

如果私鑰是PEM文件,可以用PEM_read_bio_PrivateKey讀取,例如

pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);

函數手冊,參考https://www.openssl.org/docs/man1.1.1/man3/PEM_read_bio_PrivateKey.html

從原始密鑰讀取私鑰

入股原始的密鑰只包含密鑰,例如,SM2的私鑰是一個32字節的串,

74F3D6BCC82D29819BC9D9445210B3C581373715E3D728A54580B675C3CD6620

可以直接將這串密鑰賦值給openssl的EC_KEY

pvk_bn = BN_bin2bn(pvk, CB_SM2_SECRETKEY_BYTES, NULL);
ec_key = EC_KEY_new_by_curve_name(NID_sm2);
group = EC_KEY_get0_group(ec_key);

EC_KEY_set_private_key(ec_key, pvk_bn)

也可以直接使用openssl提供的方法EVP_PKEY_new_raw_private_key,不過該方法只支持下面幾種算法:

  • EVP_PKEY_X25519

  • EVP_PKEY_ED25519

  • EVP_PKEY_X448

  • EVP_PKEY_ED448

這個函數的參考在這里 https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_get_raw_private_key.html

SM2私鑰簽名

設置pkey

EVP_PKEY* pkey = EVP_PKEY_new();

設置pkey和ec_key的關聯

EVP_PKEY_set1_EC_KEY(pkey, ec_key)

設置type為EVP_PKEY_SM2,表示要采用SM2算法進行后面的簽名。

EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2);

設置摘要上下文,簽名過程會自動計算消息摘要

EVP_MD_CTX* mctx = EVP_MD_CTX_new();
EVP_PKEY_CTX* sctx = EVP_PKEY_CTX_new(pkey, NULL);

設置id,根據SM2的國密規范,簽名要帶id

EVP_PKEY_CTX_set1_id(sctx, (const uint8_t *)id, strlen(id));
EVP_MD_CTX_set_pkey_ctx(mctx, sctx);

進行簽名,國密算法采用SM3摘要

EVP_DigestSignInit(mctx, NULL, EVP_sm3(), NULL, pkey);
EVP_DigestSignUpdate(mctx, data, data_len);
EVP_DigestSignFinal(mctx, sig, &siglen);

sig保存用戶簽名,簽名的結果采用DER編碼。下面是一個簽名結果的例子

openssl實踐-SM2國密算法簽名 | Jiangwei909的網站

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞: sm2

技術專區

關閉