PCI認證 密鑰注入 ECC算法工具 NID_secp521r1 國密算法 openssl 全套證書生成,從證書提取公私鑰數組 x,y等

步驟

1.全套證書已經生成。OK

2.找國芯要ECC加密解密簽名驗簽代碼。給的邏輯說明沒有示例代碼很難的上。

3.集成到工具 與SP聯調。

1.用openssl全套證書生成及驗證

注意:這里CA 簽發 KLD 證書用的是SHA256。因為芯片只支持SHA256算法,不支持SHA512。改成統一。

echo 如果有提示,需要把openssl的cnf下的文件復制到提示的目錄下
@echo off
setlocal enabledelayedexpansion:: 設置密碼
set PASSWORD=YourPassword:: 證書信息
set CA_CERT_SUBJ="/C=CN/ST=Beijing/L=Beijing/O=FT/OU=FT/CN=FT_KLD_CA/emailAddress=ftkdh@ftsafe.com"
set KLD_CERT_SUBJ="/C=CN/ST=Beijing/L=Beijing/O=FT/OU=FT/CN=FT_KLD/emailAddress=ftkdh@ftsafe.com":: 生成 CA 私鑰(P-521)并加密
openssl ecparam -name secp521r1 -genkey -out CA_key.pem
openssl pkcs8 -topk8 -inform PEM -outform PEM -in CA_key.pem -out CA_key_enc.pem -passout pass:%PASSWORD%
::del CA_key.pem
echo [INFO] Encrypted CA Private Key generated: CA_key_enc.pem:: 生成 CA 自簽名證書(有效期 10 年)
openssl req -x509 -new -key CA_key_enc.pem -sha512 -days 3650 -subj %CA_CERT_SUBJ% -passin pass:%PASSWORD% -out CA_cert.crt
openssl req -x509 -new -key CA_key_enc.pem -sha512 -days 3650 -subj %CA_CERT_SUBJ% -passin pass:%PASSWORD% -out CA_cert.pem
echo [INFO] CA Certificate generated: CA_cert.pem:: 生成 KLD 私鑰(P-521)并加密
openssl ecparam -name secp521r1 -genkey -out KLD_key.pem
openssl pkcs8 -topk8 -inform PEM -outform PEM -in KLD_key.pem -out KLD_key_enc.pem -passout pass:%PASSWORD%
del KLD_key.pem
echo [INFO] Encrypted KLD Private Key generated: KLD_key_enc.pem:: 生成 KLD 證書請求(CSR)
openssl req -new -key KLD_key_enc.pem -sha512 -subj %KLD_CERT_SUBJ% -passin pass:%PASSWORD% -out KLD_csr.pem
echo [INFO] KLD Certificate Signing Request generated: KLD_csr.pem:: 使用 CA 簽發 KLD 證書(有效期 10 年),輸出為 .crt 格式
openssl x509 -req -in KLD_csr.pem -CA CA_cert.pem -CAkey CA_key_enc.pem -CAcreateserial -sha256 -days 3650 -passin pass:%PASSWORD% -out KLD_cert.crt
echo [INFO] KLD Certificate signed by CA: KLD_cert.crt:: 清理臨時文件
::del CA_cert.srl
::del KLD_csr.pemecho [SUCCESS] All certificates generated successfully!echo "查看密鑰是否有效"
pause
openssl ec -in CA_key_enc.pem -check -passin pass:%PASSWORD%openssl ec -in KLD_key_enc.pem -check -passin pass:%PASSWORD%echo "查看證書信息,確認 "Issuer" 是 CA 證書。"
openssl x509 -in KLD_cert.crt -text -nooutendlocal
pause

導出KLD公私鑰

echo # 從加密私鑰提取明文私鑰
openssl ec -in KLD_key_enc.pem -passin pass:YourPassword -out KLD_key.pemecho # 從私鑰提取公鑰
openssl ec -in KLD_key.pem -pubout -out KLD_pub.pem

把證書里的私鑰、公鑰提取為c語言數組。

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serializationdef format_c_array(name, data, length=68):"""格式化為 C 語言 uint8_t 數組"""hex_values = ', '.join(f"0x{b:02X}" for b in data)return f"    uint8_t {name}[{length}] = {{\n        {hex_values}\n    }};\n"# 讀取私鑰
with open("KLD_key.pem", "rb") as f:private_key = serialization.load_pem_private_key(f.read(), password=None)# 讀取公鑰
with open("KLD_pub.pem", "rb") as f:public_key = serialization.load_pem_public_key(f.read())# 獲取私鑰數值
priv_number = private_key.private_numbers().private_value
priv_bytes = priv_number.to_bytes(68, 'big')  # 轉換成 68 字節大端存儲# 獲取公鑰數值
pub_numbers = public_key.public_numbers()
x_bytes = pub_numbers.x.to_bytes(68, 'big')  # 轉換成 68 字節
y_bytes = pub_numbers.y.to_bytes(68, 'big')  # 轉換成 68 字節# 格式化為 C 語言數組
print(format_c_array("priv_key", priv_bytes))
print(format_c_array("pub_key_x", x_bytes))
print(format_c_array("pub_key_y", y_bytes))

KLD_cert.crt去頭尾,中間做base64解碼16進制數組

需要發放KLD_cert.crt到SP驗證。
在這里插入圖片描述

ECC算法工具

有這個工具可以驗證:ECC加密解密簽名驗簽。
使芯片算法與PC算法保持一致。

私鑰長度 公鑰X長度 公鑰Y長度 都是68
在這里插入圖片描述

在這里插入圖片描述

#ifndef ECC2_H
#define ECC2_H
#include <openssl/ec.h>
#ifdef __cplusplus
extern "C"
{
#endifextern uint8_t priv_key_data[68];extern uint8_t pub_key_x_data[68];extern uint8_t pub_key_y_data[68];int KLD_ECC_Privatekey_Decrypt(BYTE* pEncdata, WORD wEncDataLen, BYTE* pExpressData, INT* pwExpressDataLen);int ECCPublicDecrypt(BYTE* public_key_B, BYTE* pbSignature, BYTE* bHashdata);int ECCPublicEncrypt(BYTE* pEncdata, WORD wEncDataLen, BYTE* pExpressData, INT* pwExpressDataLen);int KLD_ECC_Privatekey_Encrypt(BYTE* pEncdata, WORD wEncDataLen, BYTE* pExpressData);int ECC_ENC(const EC_GROUP* group, const EC_POINT* pub_key, const uint8_t* plain, size_t plain_len, uint8_t* cipher, size_t* cipher_len, BN_CTX* bn_ctx);int ECC_DEC(const EC_GROUP* group, const BIGNUM* priv_key, const uint8_t* cipher, size_t cipher_len, uint8_t* plain, size_t* plain_len, BN_CTX* bn_ctx);int ECC_main();#ifdef __cplusplus
}
#endif#endif
c++用openssl 3.4.1實現ecc算法的加解密與簽名驗簽示例 代碼寫在一個文件里
Ecc Curve為P-521,從文件讀CA_cert.pem和CA_key_enc.pem,
如果需要 就加上#define OPENSSL_API_COMPAT 10100  // 保持與 1.1.0 兼容
“ECC_Encrypt 算法
輸入:明文 M,公鑰 P(Px,Py),ECC曲線參數curve(p,a,b,G,n)
輸出:密文 C 或 invalid
算法流程:
1. 生成隨機數 k ∈ [1, n-1]
2. 計算橢圓曲線點 R(Rx, Ry) = kG
3. 計算橢圓曲線點 Q(Qx, Qy) = kP
4. 按照大端序將明文M轉換成整數 m. 如果m==0或m>=n,則輸出invalid
5. 計算 c = m * Qx mod n
6. 將點(Rx,Ry)轉換成字節串C1,將整數c轉換成字節串C2
7. 輸出密文 C = C1 || C2ECC_Decrypt 算法
輸入:密文 C = C1 || C2,私鑰 d,ECC曲線參數curve(p,a,b,G,n)
輸出:明文 M 或 invalid
算法流程:
1. 將字節串C1轉換成點R(Rx, Ry), 檢查R是否在曲線上,如果不在則輸出invalid
2. 計算橢圓曲線點 Q(Qx, Qy) = dR
3. 將字節串C2轉換成整數c,計算 m = c * Qx^(-1) mod n
4. 將整數m轉換成明文M”結合芯片提供的接口信息/*******************************************************************************
* Function Name  : ECC_Encrypt
* Description    : ECC加密
* Input          : -mes                      :明文數據
*                  -klen                 :數據長度-pstuPubKey       :公鑰-pstuEccPrams     :橢圓曲線參數
* Output         : -cipher               :密文數據
* Return         : 執行結果
******************************************************************************/
extern UINT8 ECC_Encrypt(unsigned char *mes, unsigned short klen, SM2_STU_PUBKEY *pstuPubKey, SM2_STU_PRAMS *pstuEccPrams, unsigned char *cipher);
/*******************************************************************************
* Function Name  : ECC_Encrypt
* Description    : ECC加密
* Input          : -cipher               :密文數據
*                  -klen                 :數據長度-stuPrivKey       :私鑰-pstuEccPrams     :橢圓曲線參數
* Output         : -plain                :明文數據
* Return         : 執行結果
******************************************************************************/
extern UINT8 ECC_Decrypt(unsigned char *cipher, unsigned short klen, ECC_STU_BIGINT32 *stuPrivKey, SM2_STU_PRAMS *pstuEccPrams, unsigned char *plain);

在這里插入圖片描述

C++工程加入openssl

C++工程加入openssl 使用的是Win32OpenSSL-3_0_16.exe 好像Win32OpenSSL-3_4_1.exe也行。
C:\Program Files (x86)\OpenSSL-Win32\include;
C:\Program Files (x86)\OpenSSL-Win32\lib\VC\x86\MTd;
libcrypto.lib;libssl.lib;

ECC加解密流程


ECC_Encrypt 算法
輸入:明文 M,公鑰 P(Px,Py),ECC曲線參數curve(p,a,b,G,n)
輸出:密文 C 或 invalid
算法流程:
1. 生成隨機數 k ∈ [1, n-1]
2. 計算橢圓曲線點 R(Rx, Ry) = kG
3. 計算橢圓曲線點 Q(Qx, Qy) = kP
4. 按照大端序將明文M轉換成整數 m. 如果m==0或m>=n,則輸出invalid
5. 計算 c = m * Qx mod n
6. 將點(Rx,Ry)轉換成字節串C1,將整數c轉換成字節串C2
7. 輸出密文 C = C1 || C2ECC_Decrypt 算法
輸入:密文 C = C1 || C2,私鑰 d,ECC曲線參數curve(p,a,b,G,n)
輸出:明文 M 或 invalid
算法流程:
1. 將字節串C1轉換成點R(Rx, Ry), 檢查R是否在曲線上,如果不在則輸出invalid
2. 計算橢圓曲線點 Q(Qx, Qy) = dR
3. 將字節串C2轉換成整數c,計算 m = c * Qx^(-1) mod n
4. 將整數m轉換成明文M

ECC加解密算法C代碼

在這里插入代碼片

500

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77257.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯每日刷題c++

目錄 P9240 [藍橋杯 2023 省 B] 冶煉金屬 - 洛谷 (luogu.com.cn) P8748 [藍橋杯 2021 省 B] 時間顯示 - 洛谷 (luogu.com.cn) P10900 [藍橋杯 2024 省 C] 數字詩意 - 洛谷 (luogu.com.cn) P10424 [藍橋杯 2024 省 B] 好數 - 洛谷 (luogu.com.cn) P8754 [藍橋杯 2021 省 AB2…

oracle 數據庫字段類型為NUMBER(5,2)時,并且數據庫值為0.1,為什么Java執行SQL查出來時為“.1“?

在 Oracle 數據庫中&#xff0c;當字段類型為 NUMBER(5,2) 且存儲的值為 0.1 時&#xff0c;Java 程序查詢結果可能顯示為 ".1"&#xff08;省略前導零&#xff09;&#xff0c;這是由 Oracle JDBC 驅動默認的數字格式化行為 導致的。以下是原因分析和解決方案&#…

3月AI論文精選十篇

1. Feature-Level Insights into Artificial Text Detection with Sparse Autoencoders[1] 核心貢獻&#xff1a;通過稀疏自編碼器揭示AI生成文本的檢測特征&#xff0c;提出基于特征分布的鑒別方法。研究發現&#xff0c;AI文本在稀疏編碼空間中呈現獨特的"高頻低幅"…

STM32在裸機(無RTOS)環境下,需要手動實現隊列機制來替代FreeRTOS的CAN發送接收函數

xQueueSendToBackFromISR(ecuCanRxQueue, hcan->pRxMsg, &xHigherPriorityTaskWoken)&#xff0c;xQueueReceive(mscCanRxQueue,&mscRxMsg,0)和xQueueSendToBack(mscCanTxQueue, &TxMessageTemp, 0 )這3個函數&#xff0c;在裸機下實現&#xff1a; 在裸機&…

使用PX4,gazebo,mavros為旋翼添加下視的相機(仿真采集openrealm數據集-第一步)

目錄 一.方法一&#xff08;沒成功&#xff09; 1.運行PX4 2.運行mavros通訊 3.啟動仿真世界和無人機 &#xff08;1&#xff09;單獨測試相機 &#xff08;2&#xff09;make px4_sitl gazebo啟動四旋翼iris無人機 二.方法二&#xff08;成功&#xff09; 1.通過 rosl…

7、nRF52xx藍牙學習(nrf_gpiote.c庫函數學習)

續前一篇文章。 3、nrfx_gpiote_in_event_enable void nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable) {NRFX_ASSERT(nrf_gpio_pin_present_check(pin));NRFX_ASSERT(pin_in_use_by_gpiote(pin));if (pin_in_use_by_port(pin)){nrf_gpiote_polarity_t…

Java 實現插入排序:[通俗易懂的排序算法系列之三]

引言 大家好!歡迎繼續關注我的排序算法系列。今天,我們要學習的是另一種非常基礎且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常貼近我們日常整理撲克牌的方式,理解起來相對自然。雖然它在最壞情況下的效率不高,但在某些特定場景下,它的表現甚至優…

Java的spring boot項目編譯成功啟動報錯

問題現象&#xff1a;spring boot項目&#xff0c;候刪除一些無用代碼后&#xff0c;build成功&#xff0c;啟動時報錯&#xff1a;找不到java.util.Map或者其他對象&#xff08;用Lombok注解Data&#xff09;中的字段屬性找不到等錯誤。解答&#xff1a; 常見是Lombok版本問題…

PyTorch參數管理詳解:從訪問到初始化與共享

本文通過實例代碼講解如何在PyTorch中管理神經網絡參數&#xff0c;包括參數訪問、多種初始化方法、自定義初始化以及參數綁定技術。所有代碼可直接運行&#xff0c;適合深度學習初學者進階學習。 1. 定義網絡與參數訪問 1.1 定義單隱藏層多層感知機 import torch from torch…

基于springboot+vue的課程管理系統

一、系統架構 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代碼及數據 三、功能介紹 01. 登錄 02. 管理員-首頁 03. 管理員-系管理 04. 管理員-專業管理 05. 管…

ssh密鑰連接遠程服務器并用scp傳輸文件

ssh密鑰連接遠程服務器 私鑰的權限必須是600chmod 600 id_rsa連接時在命令中加上私鑰的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH

ElasticSearch遷移數據

一、查詢索引 1、查詢所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查詢索引配置 以索引名稱hello為例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…

【Unity】animator檢測某state動畫播放完畢方法

博主對動畫系統很不熟&#xff0c;可能使用的方法比較曲折&#xff0c;但是我確實沒找到更有效的方法了。 unity的這個animator在我看來簡直有毛病啊&#xff0c;為什么那么難以獲取某狀態動畫的信息呢&#xff1f;&#xff1f;&#xff1f; 想要知道動畫播完沒有只有用norma…

Jmeter 插件【性能測試監控搭建】

1. 安裝Plugins Manager 1.1 下載路徑&#xff1a; Install :: JMeter-Plugins.org 1.2 放在lib/ext目錄下 1.3 重啟Jmeter&#xff0c;會在菜單-選項下多一個 Plugins Manager菜單&#xff0c;打開即可對插件進行安裝、升級。 2. 客戶端(Jmeter端) 2.1 安裝plugins manager…

ollama+open-webui本地部署自己的模型到d盤+兩種open-webui部署方式(詳細步驟+大量貼圖)

一、ollama準備 1.官網下載ollama&#xff1a;https://ollama.com/download 2.在 d 盤創建 ollama 文件夾&#xff0c;把軟件包放進去 3.管理員身份運行黑窗口 win r 彈出運行窗口 輸入 cmd 后&#xff0c; ctrl shift 回車&#xff0c;以管理員身份打開 3.切換到 d 盤&a…

(學習總結33)Linux Ext2 文件系統與軟硬鏈接

Linux Ext2 文件系統與軟硬鏈接 理解硬件磁盤、服務器、機柜、機房磁盤物理結構磁盤的邏輯結構實際過程 CHS 與 LBA 地址轉換 引入文件系統引入 " 塊 " 概念引入 " 分區 " 概念引入 " inode " 概念 ext2 文件系統宏觀認識Block Group 塊組與其內…

Go語言sync.Mutex包源碼解讀

互斥鎖sync.Mutex是在并發程序中對共享資源進行訪問控制的主要手段&#xff0c;對此Go語言提供了非常簡單易用的機制。sync.Mutex為結構體類型&#xff0c;對外暴露Lock()、Unlock()、TryLock()三種方法&#xff0c;分別用于阻塞加鎖、解鎖、非阻塞加鎖操作&#xff08;加鎖失敗…

SQL注入流量分析

免責聲明&#xff1a;本文僅作分享 ~ 目錄 SQL注入流量分析 特征&#xff1a; sqlmap注入類型 漏洞環境搭建 error_sql: bool_sql: time_sql: union_sql: Stacked Queries: Inline Queries: SQL注入流量分析 https://www.freebuf.com/column/161797.html SQLMAP攻擊…

Linux 時間同步工具 Chrony 簡介與使用

一、Chrony 是什么&#xff1f; chrony 是一個開源的網絡時間同步工具&#xff0c;主要由兩個組件組成&#xff1a; chronyd&#xff1a;后臺服務進程&#xff0c;負責與時間服務器交互&#xff0c;同步系統時鐘。chronyc&#xff1a;命令行工具&#xff0c;用于手動查看或修…

Flutter:Flutter SDK版本控制,fvm安裝使用

1、首先已經安裝了Dart&#xff0c;cmd中執行 dart pub global activate fvm2、windows配置系統環境變量 fvm --version3、查看本地已安裝的 Flutter 版本 fvm releases4、驗證當前使用的 Flutter 版本&#xff1a; fvm flutter --version5、切換到特定版本的 Flutter fvm use …