在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<s id="cmphk"><label id="cmphk"></label></s>
    <span id="cmphk"><var id="cmphk"></var></span>
    <dfn id="cmphk"><var id="cmphk"></var></dfn>
    <menu id="cmphk"><thead id="cmphk"></thead></menu>

    <address id="cmphk"></address>

      <dfn id="cmphk"></dfn>
      
      
      <span id="cmphk"></span>

      <object id="cmphk"><tt id="cmphk"></tt></object>
      1. 博客專(zhuān)欄

        EEPW首頁(yè) > 博客 > openssl實(shí)踐-SM2國(guó)密算法簽名

        openssl實(shí)踐-SM2國(guó)密算法簽名

        發(fā)布人:電子禪石 時(shí)間:2025-02-25 來(lái)源:工程師 發(fā)布文章

        Openssl自1.1.1版本以后,提供了對(duì)SM2國(guó)密算法的支持。

        簽名算法基本流程
        1. 對(duì)數(shù)據(jù)進(jìn)行摘要

        2. 使用私鑰對(duì)摘要進(jìn)行加密運(yùn)算(即簽名)

        準(zhǔn)備私鑰

        跟據(jù)非對(duì)稱(chēng)算法的原來(lái),簽名用的是私鑰,所以簽名前必須先準(zhǔn)備私鑰。私鑰的獲取有幾種方式

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

        首先創(chuàng)建一個(gè)ec_key, 然后用EC_KEY_generate_key生成密鑰對(duì)。

        從ec_key中提取私鑰

        BIGNUM* pvk = EC_KEY_get0_private_key(ec_key);

        從ec_key中提取公鑰

        EC_POINT* point = EC_KEY_get0_public_key(ec_key);

        可以看到私鑰和公鑰的類(lèi)型并不相同,一個(gè)是BIGNUM,一個(gè)是EC_POINT

        從PEM文件讀入私鑰

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

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

        函數(shù)手冊(cè),參考https://www.openssl.org/docs/man1.1.1/man3/PEM_read_bio_PrivateKey.html

        從原始密鑰讀取私鑰

        入股原始的密鑰只包含密鑰,例如,SM2的私鑰是一個(gè)32字節(jié)的串,

        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,不過(guò)該方法只支持下面幾種算法:

        • EVP_PKEY_X25519

        • EVP_PKEY_ED25519

        • EVP_PKEY_X448

        • EVP_PKEY_ED448

        這個(gè)函數(shù)的參考在這里 https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_get_raw_private_key.html

        SM2私鑰簽名

        設(shè)置pkey

        EVP_PKEY* pkey = EVP_PKEY_new();

        設(shè)置pkey和ec_key的關(guān)聯(lián)

        EVP_PKEY_set1_EC_KEY(pkey, ec_key)

        設(shè)置type為EVP_PKEY_SM2,表示要采用SM2算法進(jìn)行后面的簽名。

        EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2);

        設(shè)置摘要上下文,簽名過(guò)程會(huì)自動(dòng)計(jì)算消息摘要

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

        設(shè)置id,根據(jù)SM2的國(guó)密規(guī)范,簽名要帶id

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

        進(jìn)行簽名,國(guó)密算法采用SM3摘要

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

        sig保存用戶簽名,簽名的結(jié)果采用DER編碼。下面是一個(gè)簽名結(jié)果的例子

        openssl實(shí)踐-SM2國(guó)密算法簽名 | Jiangwei909的網(wǎng)站

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞: sm2

        技術(shù)專(zhuān)區(qū)

        關(guān)閉