# CipherGuard SDK API Documentation ## 概述 CipherGuard SDK 是一個 Flutter 外掛,提供完整的端對端加密(E2EE)解決方案。該 SDK 簡化了加密整合流程,提供 RSA 金鑰管理、AES 會話金鑰管理、訊息加解密等功能。 ### 主要特性 - **統一 API 介面** - 簡潔的抽象類設計,易於整合和使用 - **跨平台加密** - 所有加密邏輯在 Flutter 層實現,Android 和 iOS 保持一致 - **RSA 金鑰管理** - 生成、加密/解密私鑰 - **AES 會話金鑰** - 每個聊天室獨立的安全會話金鑰 - **訊息加解密** - 使用 AES-CTR 模式進行高效加密 - **推送通知解密** - 支援 AES-GCM 模式解密推播通知 - **原生平台同步** - 支援 iOS App Group 同步加密金鑰 --- ## Demo螢幕截圖 以下為 CipherGuard SDK 的範例應用程式截圖,展示各種功能設定介面: CipherGuard SDK Example 圖片說明: - 生成 RSA 金鑰對:產生 RSA Public / Private Key - 加密私鑰:使用使用者密碼對 RSA 私鑰進行加密 - 解密私鑰:驗證加密後私鑰是否能正確還原 - 生成會話金鑰:產生聊天室專用的 AES Session Key - 加密會話金鑰:使用 RSA 公鑰加密 Session Key(模擬金鑰交換) - 解密會話金鑰:使用 RSA 私鑰解密 Session Key - 加密訊息:使用 AES-CTR 模式加密文字訊息 - 解密訊息:解密加密後的訊息內容 - 畫面中顯示 解密結果:Hello, this is a secret message!,代表端對端加解密流程成功 - 同步加密金鑰到原生:將聊天室金鑰同步至原生平台(例如 iOS App Group) - 用於支援 Notification Service Extension 或其他原生模組存取加密金鑰 - 設定 AES_SECRET:設定用於推送通知 AES-GCM 解密的密鑰 - 對應實際 APNS 推送通知加密 / 解密使用情境 --- ## API 總覽 ### 方法(Methods) | 方法 | 回傳類型 | 說明 | |------|----------|------| | `platformVersion()` | `Future` | 獲取平台版本 | | `generateRsaKeyPair({int keySize = 1024})` | `Future` | 生成 RSA 金鑰對 | | `encryptPrivateKey({required String privateKey, required String password})` | `Future` | 用密碼加密私鑰 | | `decryptPrivateKey({required String encryptedPrivateKey, required String password})` | `Future` | 解密私鑰 | | `generateSessionKey({int initialRound = 1})` | `Future` | 生成 AES 會話金鑰 | | `encryptSessionKey({required String sessionKey, required String publicKey})` | `Future` | 用 RSA 公鑰加密會話金鑰 | | `decryptSessionKey({required String encryptedSessionKey, required String privateKey})` | `Future` | 用 RSA 私鑰解密會話金鑰 | | `encryptMessage({required String plaintext, required String sessionKey, required int round})` | `Future` | 加密訊息 | | `decryptMessage({required String encryptedData, required String sessionKey, required int round})` | `Future` | 解密訊息 | | `syncEncryptionKey({required String chatId, required int activeRound, required int round, required String activeKeySingle})` |, required bool is `Future` | 同步加密金鑰到原生平台 | | `syncAllEncryptionKeys({required Map> chatMap})` | `Future` | 批量同步所有加密金鑰 | | `setAesSecret({required String aesSecret})` | `Future` | 設置 AES_SECRET | | `decryptPushNotification({required String encryptedData})` | `Future` | 解密推送通知 | ### 實體類別(Entities) | 類別 | 說明 | |------|------| | `RsaKeyPair` | RSA 金鑰對(公鑰/私鑰) | | `SessionKey` | AES 會話金鑰 | | `EncryptedMessage` | 加密訊息 | --- ## 安裝 在 `pubspec.yaml` 中新增依賴: ```yaml dependencies: cipher_guard_sdk: ^1.0.0 ``` ### Flutter 安裝 執行以下命令獲取依賴: ```bash flutter pub get ``` ### 初始化 在 `main.dart` 中初始化 SDK: ```dart import 'package:cipher_guard_sdk/cipher_guard_sdk.dart'; ``` --- ## 快速開始 ### 1. 初始化 SDK ```dart import 'package:flutter/material.dart'; import 'package:cipher_guard_sdk/cipher_guard_sdk.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { final CipherGuardSdkApi cipherGuard = CipherGuardSdkApi(); @override void initState() { super.initState(); _testEncryption(); } Future _testEncryption() async { try { // 1. 生成 RSA 金鑰對 final keyPair = await cipherGuard.generateRsaKeyPair(keySize: 1024); print('Public Key: ${keyPair.publicKey}'); print('Private Key: ${keyPair.privateKey}'); // 2. 用密碼加密私鑰 const password = 'user_password_123'; final encryptedPrivateKey = await cipherGuard.encryptPrivateKey( privateKey: keyPair.privateKey, password: password, ); print('Encrypted Private Key: $encryptedPrivateKey'); // 3. 解密私鑰 final decryptedPrivateKey = await cipherGuard.decryptPrivateKey( encryptedPrivateKey: encryptedPrivateKey, password: password, ); print('Decrypted Private Key: $decryptedPrivateKey'); // 4. 生成會話金鑰 final sessionKey = await cipherGuard.generateSessionKey(initialRound: 1); print('Session Key: ${sessionKey.key}'); print('Session Round: ${sessionKey.round}'); // 5. 用 RSA 公鑰加密會話金鑰 final encryptedSessionKey = await cipherGuard.encryptSessionKey( sessionKey: sessionKey.key, publicKey: keyPair.publicKey, ); print('Encrypted Session Key: $encryptedSessionKey'); // 6. 用 RSA 私鑰解密會話金鑰 final decryptedSessionKey = await cipherGuard.decryptSessionKey( encryptedSessionKey: encryptedSessionKey, privateKey: keyPair.privateKey, ); print('Decrypted Session Key: $decryptedSessionKey'); // 7. 加密訊息 const message = 'Hello, this is a secret message!'; final encryptedMessage = await cipherGuard.encryptMessage( plaintext: message, sessionKey: sessionKey.key, round: sessionKey.round, ); print('Encrypted Message: ${encryptedMessage.data}'); print('Message Round: ${encryptedMessage.round}'); // 8. 解密訊息 final decryptedMessage = await cipherGuard.decryptMessage( encryptedData: encryptedMessage.data, sessionKey: sessionKey.key, round: encryptedMessage.round, ); print('Decrypted Message: $decryptedMessage'); // 9. 設置 AES_SECRET 用於推送解密 await cipherGuard.setAesSecret(aesSecret: 'your_aes_secret_key_here'); print('All encryption tests passed!'); } catch (e) { print('Encryption test failed: $e'); } } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('CipherGuard SDK Demo')), body: const Center( child: Text('CipherGuard SDK Demo'), ), ), ); } } ``` --- ## CipherGuardSdkApi 介面 `CipherGuardSdkApi` 是 SDK 的核心抽象類,提供了所有加密相關功能。 ### 方法 #### `platformVersion` ```dart Future platformVersion(); ``` **描述**:獲取當前平台版本。 **使用範例**: ```dart final version = await cipherGuard.platformVersion(); print('Platform Version: $version'); ``` --- #### `generateRsaKeyPair` ```dart Future generateRsaKeyPair({int keySize = 1024}); ``` **描述**:生成 RSA 金鑰對。 **參數**: | 參數 | 類型 | 預設值 | 說明 | |------|------|--------|------| | `keySize` | `int` | 1024 | RSA 金鑰長度(支援 1024、2048) | **使用範例**: ```dart final keyPair = await cipherGuard.generateRsaKeyPair(keySize: 2048); print('Public Key: ${keyPair.publicKey}'); print('Private Key: ${keyPair.privateKey}'); ``` **返回結果**: | 屬性 | 類型 | 說明 | |------|------|------| | `publicKey` | `String` | PEM 格式的公鑰 | | `privateKey` | `String` | PEM 格式的私鑰 | --- #### `encryptPrivateKey` ```dart Future encryptPrivateKey({ required String privateKey, required String password, }); ``` **描述**:使用密碼對 RSA 私鑰進行加密。採用 AES-CBC 模式,使用 MD5(password) 作為金鑰。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `privateKey` | `String` | 是 | PEM 格式的私鑰 | | `password` | `String` | 是 | 用於加密的密碼 | **使用範例**: ```dart final encryptedKey = await cipherGuard.encryptPrivateKey( privateKey: keyPair.privateKey, password: 'user_password', ); ``` --- #### `decryptPrivateKey` ```dart Future decryptPrivateKey({ required String encryptedPrivateKey, required String password, }); ``` **描述**:使用密碼解密 RSA 私鑰。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `encryptedPrivateKey` | `String` | 是 | Base64 編碼的加密私鑰 | | `password` | `String` | 是 | 用於解密的密碼 | **使用範例**: ```dart final privateKey = await cipherGuard.decryptPrivateKey( encryptedPrivateKey: encryptedKey, password: 'user_password', ); ``` --- #### `generateSessionKey` ```dart Future generateSessionKey({int initialRound = 1}); ``` **描述**:生成 AES 會話金鑰(32 字節隨機金鑰)。 **參數**: | 參數 | 類型 | 預設值 | 說明 | |------|------|--------|------| | `initialRound` | `int` | 1 | 初始 round 值 | **使用範例**: ```dart final sessionKey = await cipherGuard.generateSessionKey(initialRound: 1); print('Key: ${sessionKey.key}'); print('Round: ${sessionKey.round}'); ``` **返回結果**: | 屬性 | 類型 | 說明 | |------|------|------| | `key` | `String` | Base64 編碼的 32 字節會話金鑰 | | `round` | `int` | 金鑰 round 值 | --- #### `encryptSessionKey` ```dart Future encryptSessionKey({ required String sessionKey, required String publicKey, }); ``` **描述**:使用 RSA 公鑰加密會話金鑰。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `sessionKey` | `String` | 是 | Base64 編碼的會話金鑰 | | `publicKey` | `String` | 是 | PEM 格式的 RSA 公鑰 | **使用範例**: ```dart final encryptedSessionKey = await cipherGuard.encryptSessionKey( sessionKey: sessionKey.key, publicKey: keyPair.publicKey, ); ``` --- #### `decryptSessionKey` ```dart Future decryptSessionKey({ required String encryptedSessionKey, required String privateKey, }); ``` **描述**:使用 RSA 私鑰解密會話金鑰。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `encryptedSessionKey` | `String` | 是 | Base64 編碼的加密會話金鑰 | | `privateKey` | `String` | 是 | PEM 格式的 RSA 私鑰 | **使用範例**: ```dart final decryptedKey = await cipherGuard.decryptSessionKey( encryptedSessionKey: encryptedSessionKey, privateKey: keyPair.privateKey, ); ``` --- #### `encryptMessage` ```dart Future encryptMessage({ required String plaintext, required String sessionKey, required int round, }); ``` **描述**:使用 AES-CTR 模式加密訊息。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `plaintext` | `String` | 是 | 要加密的原始訊息 | | `sessionKey` | `String` | 是 | Base64 編碼的會話金鑰 | | `round` | `int` | 是 | 金鑰 round 值 | **使用範例**: ```dart final encryptedMessage = await cipherGuard.encryptMessage( plaintext: 'Hello, World!', sessionKey: sessionKey.key, round: sessionKey.round, ); print('Encrypted Data: ${encryptedMessage.data}'); ``` **返回結果**: | 屬性 | 類型 | 說明 | |------|------|------| | `round` | `int` | 金鑰 round 值 | | `data` | `String` | Base64 編碼的加密內容(IV + 加密資料) | --- #### `decryptMessage` ```dart Future decryptMessage({ required String encryptedData, required String sessionKey, required int round, }); ``` **描述**:使用 AES-CTR 模式解密訊息。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `encryptedData` | `String` | 是 | Base64 編碼的加密資料 | | `sessionKey` | `String` | 是 | Base64 編碼的會話金鑰 | | `round` | `int` | 是 | 金鑰 round 值 | **使用範例**: ```dart final decrypted = await cipherGuard.decryptMessage( encryptedData: encryptedMessage.data, sessionKey: sessionKey.key, round: encryptedMessage.round, ); print('Decrypted: $decrypted'); ``` --- #### `syncEncryptionKey` ```dart Future syncEncryptionKey({ required String chatId, required int activeRound, required int round, required String activeKey, required bool isSingle, }); ``` **描述**:同步單個聊天室的加密金鑰到原生平台(iOS App Group)。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `chatId` | `String` | 是 | 聊天室 ID | | `activeRound` | `int` | 是 | 當前活躍的 round 值 | | `round` | `int` | 是 | round 值 | | `activeKey` | `String` | 是 | 活躍的加密金鑰 | | `isSingle` | `bool` | 是 | 是否為單聊 | **使用範例**: ```dart await cipherGuard.syncEncryptionKey( chatId: 'chat_123', activeRound: 1, round: 1, activeKey: sessionKey.key, isSingle: false, ); ``` --- #### `syncAllEncryptionKeys` ```dart Future syncAllEncryptionKeys({ required Map> chatMap, }); ``` **描述**:批量同步所有加密聊天室的金鑰到原生平台。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `chatMap` | `Map>` | 是 | 聊天室金鑰映射 | **使用範例**: ```dart final chatMap = { 'chat_1': { 'activeKey': sessionKey.key, 'activeRound': 1, 'round': 1, 'isSingle': false, }, 'chat_2': { 'activeKey': anotherKey.key, 'activeRound': 1, 'round': 1, 'isSingle': true, }, }; await cipherGuard.syncAllEncryptionKeys(chatMap: chatMap); ``` --- #### `setAesSecret` ```dart Future setAesSecret({required String aesSecret}); ``` **描述**:設置 AES_SECRET(用於推送通知解密)。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `aesSecret` | `String` | 是 | AES 密鑰(十六進制字串) | **使用範例**: ```dart await cipherGuard.setAesSecret(aesSecret: '0123456789abcdef'); ``` --- #### `decryptPushNotification` ```dart Future decryptPushNotification({required String encryptedData}); ``` **描述**:解密 APNS 推送通知內容。使用 AES-GCM 模式。 **參數**: | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | `encryptedData` | `String` | 是 | Base64 編碼的加密資料 | **使用範例**: ```dart final decrypted = await cipherGuard.decryptPushNotification( encryptedData: pushNotificationData, ); ``` --- ## 實體類別 ### RsaKeyPair ```dart class RsaKeyPair { final String publicKey; final String privateKey; const RsaKeyPair({ required this.publicKey, required this.privateKey, }); /// 檢查金鑰對是否有效 bool get isValid => publicKey.isNotEmpty && privateKey.isNotEmpty; } ``` **屬性說明**: | 屬性 | 類型 | 說明 | |------|------|------| | `publicKey` | `String` | PEM 格式的 RSA 公鑰 | | `privateKey` | `String` | PEM 格式的 RSA 私鑰 | | `isValid` | `bool` | 金鑰對是否有效 | --- ### SessionKey ```dart class SessionKey { final String key; // Base64 編碼的 32 字節金鑰 final int round; // 金鑰輪換 round 值 const SessionKey({ required this.key, required this.round, }); } ``` **屬性說明**: | 屬性 | 類型 | 說明 | |------|------|------| | `key` | `String` | Base64 編碼的 32 字節 AES 會話金鑰 | | `round` | `int` | 金鑰輪換 round 值 | --- ### EncryptedMessage ```dart class EncryptedMessage { final int round; // 金鑰輪換 round 值 final String data; // Base64 編碼的加密內容 const EncryptedMessage({ required this.round, required this.data, }); /// 從 JSON 創建 factory EncryptedMessage.fromJson(Map json) { return EncryptedMessage( round: json['round'] as int, data: json['data'] as String, ); } /// 轉換為 JSON Map toJson() { return { 'round': round, 'data': data, }; } } ``` **屬性說明**: | 屬性 | 類型 | 說明 | |------|------|------| | `round` | `int` | 金鑰 round 值 | | `data` | `String` | Base64 編碼的加密內容 | --- ## 加密流程 ### 訊息加密流程 ``` 1. 用戶 A 生成 RSA 金鑰對 ├── publicKey_A (公開) └── privateKey_A (保密,用密碼加密存儲) 2. 用戶 A 生成會話金鑰 └── sessionKey (每個聊天室獨立) 3. 用戶 A 用 RSA publicKey_B 加密會話金鑰 └── encryptedSessionKey (傳送給用戶 B) 4. 用戶 A 加密訊息 └── encryptMessage(plaintext, sessionKey, round) └── EncryptedMessage(round, data) ``` ### 訊息解密流程 ``` 1. 用戶 B 收到加密的會話金鑰 └── decryptSessionKey(encryptedSessionKey, privateKey_B) 2. 用戶 B 解密訊息 └── decryptMessage(encryptedData, sessionKey, round) └── plaintext ``` --- ## iOS 設定 ### App Groups 設定 用於加密金鑰同步,需要設定 App Groups: 在 Xcode 中選擇你的主 Target: - **Signing & Capabilities** → **+ Capability** → **App Groups** - 建立名為 `group.com.example.cipherguard` 的 App Group --- ## Android 設定 無需額外設定。SDK 使用 Flutter 層的加密邏輯。 --- ## 完整範例 以下是一個完整的端對端加密聊天整合範例: ```dart import 'package:flutter/material.dart'; import 'package:cipher_guard_sdk/cipher_guard_sdk.dart'; void main() { runApp(const ChatApp()); } class ChatApp extends StatefulWidget { const ChatApp({super.key}); @override State createState() => _ChatAppState(); } class _ChatAppState extends State { final CipherGuardSdkApi cipherGuard = CipherGuardSdkApi(); // 用戶的金鑰對 RsaKeyPair? _keyPair; // 聊天室的會話金鑰 SessionKey? _sessionKey; @override void initState() { super.initState(); _initializeEncryption(); } Future _initializeEncryption() async { // 生成 RSA 金鑰對 _keyPair = await cipherGuard.generateRsaKeyPair(keySize: 2048); // 生成會話金鑰 _sessionKey = await cipherGuard.generateSessionKey(initialRound: 1); setState(() {}); } Future _sendMessage(String message) async { if (_sessionKey == null) return; // 加密訊息 final encrypted = await cipherGuard.encryptMessage( plaintext: message, sessionKey: _sessionKey!.key, round: _sessionKey!.round, ); // 發送 encrypted.round 和 encrypted.data 給對方 print('Sending encrypted message: ${encrypted.data}'); } Future _receiveMessage(String encryptedData, int round) async { if (_sessionKey == null) return ''; // 解密訊息 final decrypted = await cipherGuard.decryptMessage( encryptedData: encryptedData, sessionKey: _sessionKey!.key, round: round, ); return decrypted; } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('E2E Chat Demo')), body: Center( child: _keyPair == null ? const CircularProgressIndicator() : Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('RSA Key Generated: ${_keyPair!.publicKey.substring(0, 50)}...'), const SizedBox(height: 20), Text('Session Key: ${_sessionKey!.key.substring(0, 20)}...'), const SizedBox(height: 20), ElevatedButton( onPressed: () => _sendMessage('Hello, World!'), child: const Text('Send Encrypted Message'), ), ], ), ), ), ); } } ``` --- ## 安全性說明 ### 金鑰管理 1. **RSA 私鑰保護**:私鑰必須使用強密碼加密後存儲 2. **會話金鑰**:每個聊天室應使用獨立的會話金鑰 3. **金鑰輪換**:透過 round 值實現金鑰輪換 ### 加密算法 | 功能 | 算法 | 模式 | 說明 | |------|------|------|------| | RSA 金鑰生成 | RSA | - | 支援 1024/2048 位元 | | 私鑰加密 | AES | CBC | 使用 MD5(password) 作為金鑰 | | 會話金鑰加密 | RSA | PKCS1 | 標準 RSA 加密 | | 訊息加密 | AES | CTR | 高效流式加密 | | 推送解密 | AES | GCM | 帶認證的加密 | --- ## 版本歷史 | 版本 | 日期 | 說明 | |-------|-----------|--------| | 0.0.1 | 01/30/2026 | 相關金鑰生成 | --- ## 許可協議 MIT License