如何加載私鑰為 SecKeyRef

本文介紹如何在 iOS/macOS 下將私鑰加載為 SecKeyRef,涵蓋 PEM 格式的 ECC 密鑰讀取、X9.63 數據構建、以及與 Keychain 的集成。


1. 使用 SecKeyCreateWithData 加載私鑰

Apple 提供的 SecKeyCreateWithData 方法可以直接將密鑰數據加載為 SecKeyRef 對象。

SecKeyRef SecKeyCreateWithData(CFDataRef keyData, CFDictionaryRef attributes, CFErrorRef  _Nullable *error);

文檔:SecKeyCreateWithData(::_😃 | Apple Developer Documentation

attributes 必須包含如下 key

  • kSecAttrKeyType:密鑰類型,如 ECC、RSA
  • kSecAttrKeyClass:密鑰類(公鑰/私鑰)

keyData 的數據格式

  • ECC 私鑰數據應采用 X9.63 格式。
  • RSA 私鑰應為 PKCS #1 格式。

詳見:SecKeyCopyExternalRepresentation(:😃 | Apple Developer Documentation

X9.63 格式說明

  • ECC 公鑰:04 || X || Y
  • ECC 私鑰:04 || X || Y || K
    其中 X、Y 為公鑰坐標,K 為大端序編碼的私鑰值,所有字段均為定長,必要時補零。

構建 X9.63 可參考:將加密工具包密鑰存儲在鑰匙串 | 蘋果開發者文檔


2. PEM 格式轉換與讀取

2.1 PEM 轉 P256

如果你有 PEM 編碼的 P256 私鑰,可用 CryptoKit 直接解析為 P256 私鑰對象:

文檔:init(pemRepresentation:) | Apple Developer Documentation

2.2 讀取 ECC PEM 密鑰為 SecKey

示例代碼(Swift):

/// 加載 PEM 證書為 SecKey
/// - Parameter name: PEM 文件名(不含擴展名)
/// - Returns: SecKey 類型值
class func loadECCSecKeyFromPem(_ name: String) -> SecKey? {guard let pemURL = Bundle.main.url(forResource: name, withExtension: "pem") else {return nil}do {let pemStr = try String(contentsOf: pemURL)let p256 = try P256.Signing.PrivateKey(pemRepresentation: pemStr)let attributes: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,kSecAttrKeyClass as String: kSecAttrKeyClassPrivate]// kSecAttrIsPermanent 是否需要存儲,默認不存儲guard let secKey = SecKeyCreateWithData(p256.x963Representation as CFData,attributes as CFDictionary,nil)else {return nil}return secKey} catch {print(error)return nil}
}

如果需要將 PEM 轉換為 X9.63,可先用 CryptoKit 讀取后再取其 x963Representation 字節。


3. iOS 端創建 ECC 私鑰并存儲到 Keychain

如需新建私鑰并寫入鑰匙串,可參考如下 Objective-C 代碼:

+ (NSDictionary *)privateKeyParams {return @{(__bridge NSString *) kSecClass : (__bridge NSString *) kSecClassKey,(__bridge NSString *) kSecAttrApplicationLabel : MTRCAKeyChainLabel,// 存入鑰匙串時,按需設置屬性(__bridge NSString *) kSecAttrKeyClass : (__bridge NSString *) kSecAttrKeyClassSymmetric,};
}
+ (NSDictionary *)privateKeyCreationParams {// 按需設置密鑰長度const size_t keySizeInBits = 256;return @{(__bridge NSString *) kSecAttrKeyClass : (__bridge NSString *) kSecAttrKeyClassPrivate,(__bridge NSString *) kSecAttrKeyType : (__bridge NSNumber *) kSecAttrKeyTypeECSECPrimeRandom,(__bridge NSString *) kSecAttrKeySizeInBits : @(keySizeInBits),(__bridge NSString *) kSecAttrIsPermanent : @(NO), // 是否永久保存};
}
/// 創建并存儲 ECC 私鑰
+ (SecKeyRef)generateCAPrivateKey {NSMutableDictionary *query = [[NSMutableDictionary alloc] initWithDictionary:[MSMatterFabricKeys privateKeyParams]];// 先刪除舊密鑰,防止添加失敗SecItemDelete((__bridge CFDictionaryRef) query);CFErrorRef error = NULL;SecKeyRef key = SecKeyCreateRandomKey((__bridge CFDictionaryRef)[MSMatterFabricKeys privateKeyCreationParams], &error);if (error) {NSLog(@"Could not generate private key: %@", (__bridge NSError *) error);return NULL;}NSData *keyData = (__bridge_transfer NSData *) SecKeyCopyExternalRepresentation(key, &error);if (error) {NSLog(@"Could not get key external representation: %@", (__bridge NSError *) error);CFRelease(key);return NULL;}query[(__bridge NSString *) kSecValueData] = [keyData base64EncodedDataWithOptions:0];OSStatus status = SecItemAdd((__bridge CFDictionaryRef) query, NULL);if (status != errSecSuccess) {NSLog(@"Failed to store private key : %d", status);CFRelease(key);return NULL;}return key;
}

4. 證書直接讀取

如需直接讀取證書內容,可參考:證書讀取方法(CSDN)


5. 相關資源

  • SecKeyCreateWithData | Apple Developer Documentation
  • SecKeyCopyExternalRepresentation | Apple Developer Documentation
  • 將加密工具包密鑰存儲在鑰匙串 | Apple Developer Documentation
  • PEM 轉 P256 | Apple Developer Documentation
  • 證書讀取方法(CSDN)

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

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

相關文章

Missashe考研日記—Day44-Day50

Missashe考研日記—Day44-Day50 寫在面前 本系列博客用于記錄博主一周的學習進度,具體知識總結在目前已有的筆記中:1.高數強化學習筆記2.計網復習筆記3.新增:線代題型總結 專業課408 這周先是把計網第三章數據鏈路層剩下的局域網以及之后…

Windows下安裝并使用kubectl查看K8S日志

【1】安裝kubectl 官網文檔:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下載后得到 kubectl.exe,放到一個目錄下,然后配置環境變量。 此時CMD 進入DOS命令窗口 kubectl version【2】配置config文件 其實就是…

攻防世界János-the-Ripper

打開壓縮包是一個文件,用010Editor打開可以發現里面有隱藏文件flag.txt 此時想到分離文件,利用binwalk工具 利用binwalk生成出的是一個壓縮包,解壓縮但是發現竟然解壓需要密碼 這里就可以開始暴力破解密碼了,這里我用的是ARCHPR工…

XPlifeapp:高效打印,便捷生活

在數字化時代,雖然電子設備的使用越來越普遍,但打印的需求依然存在。無論是學生需要打印課表、資料,還是職場人士需要打印名片、報告,一個高效便捷的打印軟件都能大大提高工作效率。XPlifeapp就是這樣一款超級好用的手機打印軟件&…

【計算機網絡】第2章:應用層—Web and HTTP

目錄 一、Web 與 HTTP 二、總結 (一)Web 的定義與功能 (二)HTTP 協議的定義與功能 (三)HTTP 協議的核心機制 1. HTTP 請求與響應流程 2. HTTP 的連接類型 3. HTTP 的狀態碼 (四&#xf…

如何實現 LRU 緩存:基于LinkedHashMap?

全文目錄: 開篇語前言1. LinkedHashMap 簡介1.1 LinkedHashMap 的構造方法 2. 基于 LinkedHashMap 實現 LRU 緩存2.1 設計思路2.2 實現步驟2.3 代碼說明2.4 測試案例2.5 解釋 3. LRU 緩存優化3.1 removeEldestEntry() 方法的靈活性3.2 內存管理 4. 總結文末 開篇語 …

Spring Boot測試框架全面解析

Spring Boot測試框架基礎 Spring Boot通過增強Spring測試框架的能力,為開發者提供了一系列簡化測試流程的新注解和特性。該框架建立在成熟的Spring測試基礎之上,通過自動化配置和專用注解顯著提升了測試效率。 核心依賴配置 要使用Spring Boot的全部測試功能,只需在項目中…

Spring Boot 整合 Spring Data JPA、strategy 的策略區別、什么是 Spring Data JPA

DAY29.2 Java核心基礎 Spring Boot 整合 Spring Data JPA Spring Data JPA根據具體的數據庫分為不同的子模塊,無論是關系型數據庫和非關系型數據庫,Spring Data都提供了支持 Mysql:Spring Data JPA Redis:Spring Data Redis …

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 免費內網穿透家用服務器

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 本文檔總結了服務器配置相關內容,包括 Ubuntu 服務器配置、硬盤擴容、靜態 IP 設置以及 Cloudflare Tunnel 的部署步驟。 目錄 硬盤分區與擴容設置靜態 IPCloudflare Tunnel 部署SSH 通過 Cloudflare Tunnel常見…

降低實驗檢測報告編制耗時 質檢LIMS系統的應用策略

在質檢工作流程中,檢測報告編制往往是耗時耗力的關鍵環節。傳統人工編制報告不僅效率低下,還容易出現數據錯誤、格式不統一等問題。質檢 LIMS 系統憑借其強大的自動化、智能化功能,為檢測報告編制帶來革命性變革,能夠將編制時間減…

同為.net/C#的跨平臺運行時的mono和.net Core有什么區別?

Mono 和 .NET Core(現已統一為 .NET)都是 .NET 生態的跨平臺實現,但它們在設計目標、技術特性和應用場景上有顯著區別。以下是詳細對比: ??1. 歷史背景?? ??項目????誕生時間????開發者????當前狀態????Mo…

Android AIDL Hal最低保證出現的問題

1. AIDL HAL 的“最低保證”特性 (1)協議層級的強制支持 在 IComposer AIDL 接口定義中(如 android.hardware.graphics.composer3),Google 已經將部分功能列為 必須支持的特性(MUST)。例如&am…

蘋果FINDMY和谷歌FIND HUB增強共享位置功能

近期,蘋果Findmy增強了追蹤和分享丟失物品位置方面的功能,“共享物品位置”,用戶可以安全地與航空a公司等第三方分享丟失物品的位置,以便于行李找回。 iOS 18.2的這一新功能使用戶可以輕松、安全地與航空公司等第三方分享AirTag或…

基于GA遺傳優化的FIR濾波器幅頻相頻均衡補償算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 在數字信號處理領域,有限沖激響應(FIR)濾波器因其結構簡單、穩定性好且易于實現線性相位等優點被廣泛應用。然而,實…

雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開

在雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開,并追求性能最優,需要從硬件、宿主機系統、KVM配置、虛擬機配置等多個層面進行優化。 以下是詳細的操作指南和優化建議: 階段一:BIOS/UEFI 設置優化 (重啟進入) 啟用虛擬化…

adb查看、設置cpu相關信息

查內存 adb shell dumpsys meminfo查CPU top -m 10打開 system_monitor adb shell am start -n eu.chainfire.perfmon/.LaunchActivity設置CPU的核心數 在/sys/devices/system/cpu目錄下可以看到你的CPU有幾個核心,如果是雙核,就是cpu0和cpu1&#xff0c…

【Unity基礎】Unity新手實戰教程:用ScriptableObject控制Cube顏色

目錄 項目概述🛠? 完整操作步驟(10分鐘內完成)步驟1:創建ScriptableObject類步驟2:創建顏色配置資產步驟3:創建Cube控制器步驟4:設置場景和Cube步驟5:添加簡單UI提示步驟6&#xff…

One Year~

入局 作為科班學生,沒事就在CSDN閑逛,只作為旁觀者的身份去體會別人的好文。當時也沒想著說去自己寫一些博客記錄學習過程。相信大多數同學和我有一樣的心理。 但在看魚皮哥的課程時,發現他有著寫文檔和博客的習慣,整理自己的思路…

【Redis】第3節|深入理解Redis線程模型

一、Redis基礎認知 (一)定義與定位 Redis(Remote Dictionary Server)是開源高性能鍵值數據庫,核心特點如下: 數據結構豐富:支持字符串、哈希、列表、集合、有序集合等復雜數據類型&#xff0…

vben-admin 2.8.0 版本修改 axios響應處理邏輯

此前端框架下的 Axios 在后端返回的結果老是無法正常解析&#xff0c;找到他源碼的封裝類&#xff0c;修正這個問題 文件位于 src\utils\http\axios\index.ts 修改前 transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) > {const { t }…