# SM9-Embodied-Guardian **Repository Path**: bowie_Lee/SM9-Embodied-Guardian ## Basic Information - **Project Name**: SM9-Embodied-Guardian - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 24 - **Created**: 2026-01-29 - **Last Updated**: 2026-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SM9-Embodied-Guardian > SM9 签名令牌 + 具身智能数据隐私保护与安全访问控制(JSON/SQLite + Streamlit + ROS2) [中文](README.md) | [English](README_EN.md) | 链接 | 地址 | | --- | --- | | 仓库 | https://gitee.com/silver-guardian/SM9-Embodied-Guardian | | Issues | https://gitee.com/silver-guardian/SM9-Embodied-Guardian/issues | | Pull Requests | https://gitee.com/silver-guardian/SM9-Embodied-Guardian/pulls | ## 目录 - [项目简介](#项目简介) - [快速开始](#快速开始) - [功能特性](#功能特性) - [环境要求](#环境要求) - [安装步骤](#安装步骤) - [使用方法](#使用方法) - [开发指南](#开发指南) - [许可证](#许可证) - [联系方式](#联系方式) ## 项目简介 本项目包含两个任务模块: 1. **任务 1:SM9 算法基础与密钥管理** - 系统初始化(主密钥生成与参数持久化) - 用户注册与属性管理 - 用户私钥提取与加密存储 - 分发令牌(可校验) - 属性更新触发用户密钥轮换、主密钥轮换、撤销列表 - 审计日志记录(JSON Lines) 2. **任务 2:具身智能数据隐私保护与安全访问控制** - 生成机器人/医疗两类传感数据各 5 条并**加密存储** - 基于用户属性 + 访问策略进行权限裁决(raw/privacy/deny) - 对授权访问返回**SM9签名令牌**,支持验签 - 对普通权限用户返回**隐私化(脱敏)后的数据** - 输出**权限审计报告**(包含逐条访问明细:用户属性/命中策略/访问结果/隐私参数等) 项目支持: - JSON / SQLite 双存储后端 - Streamlit 可视化仪表盘(中文界面) ## 快速开始 ```bash git clone https://gitee.com/silver-guardian/SM9-Embodied-Guardian.git cd SM9-Embodied-Guardian python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: # source venv/bin/activate pip install -r requirements.txt streamlit run sm9_privacy_access/dashboard.py ``` 如果你只希望运行测试与生成报告,不需要启动 Streamlit。 更多运行命令与参数(含 ROS2/Gazebo 演示)请参考:`使用方法.md`。 ## 功能特性 ### 核心功能 - **SM9 密钥管理** - 系统初始化(主密钥对生成) - 用户密钥提取 - 密钥分发机制 - 密钥更新/轮换 - 密钥撤销机制 - 主密钥轮换 - **用户属性管理** - 属性的创建、读取、更新、删除 - 属性与密钥的绑定 - 属性变更触发密钥更新 - **数据存储** - JSON文件存储(轻量级,适合原型验证) - SQLite数据库存储(生产环境,支持并发) - 私钥加密存储(AES-GCM) - 数据完整性校验(HMAC) - **可视化仪表盘(Streamlit)** - 系统初始化、主密钥轮换 - 用户注册、属性更新、密钥分发/轮换/撤销 - 策略管理与评估 - 审计日志查看 - SQLite/JSON 存储后端一键切换与查看 - **访问策略引擎** - 基于属性的访问策略定义 - 支持 AND/OR/NOT 逻辑运算符 - 动态策略评估 - **权限审计追踪** - 完整的操作日志记录 - 时间戳、用户、资源、策略、结果等信息 - JSON Lines 格式日志 - **任务 2:隐私保护与安全访问控制** - 具身智能多模态数据结构(机器人轨迹/行为日志/医疗生命体征等) - 隐私化处理(mask/noise 元信息) - 安全访问控制:根据策略返回 `raw` / `privacy` / `deny` - 对授权/拒绝访问均签发可验签令牌(用于审计与追溯) - 加密存储(独立于任务 1 的用户私钥加密存储) - 权限审计报告:按用户/角色/资源/data_id/policy_id 统计,并输出逐条访问明细 ## 环境要求 ### 操作系统 - Windows / Linux / macOS 均可运行(建议 Python 3.10+) 注意:本项目使用 `gmssl-python`,它依赖 **GmSSL 动态库**(如 Linux 下 `libgmssl.so`、Windows 下 `gmssl.dll`)。 如果你在 Windows 上安装/加载动态库有困难,建议使用 **WSL2(Ubuntu)** 来运行。 ### GmSSL 动态库说明(重要) `gmssl-python` 是对 GmSSL(OpenSSL 分支)的 ctypes 封装。 如果没有正确安装/加载 GmSSL 动态库,通常会在 `import gmssl` 时报错。 你可以用下面命令快速检查环境是否具备 SM9 能力: ```bash python -c "import gmssl; print('Sm9EncMasterKey' in dir(gmssl))" ``` ### Python 环境 - Python 3.10 或更高版本 - pip 包管理器 ### 依赖库 项目依赖的 Python 库(见 `requirements.txt`): ```text gmssl-python==2.2.2 # 国密算法库(SM9算法) cryptography==42.0.8 # 加密算法库(AES-GCM、HMAC等) pydantic==2.7.4 # 数据验证库 pytest==8.2.2 # 测试框架 streamlit==1.36.0 # 可视化仪表盘 ``` ## 安装步骤 ```bash pip install -r requirements.txt ``` ## 使用方法 ### 运行演示程序 ```bash # 任务1演示(系统初始化/用户/策略/审计示例) python -m sm9_privacy_access # 任务2演示:生成 5+5 数据,加密存储,模拟多用户访问,输出权限审计报告 python -m sm9_privacy_access.embodied_privacy_access.demo_embodied_privacy_access ``` 演示程序将: 1. 初始化SM9系统 2. 注册示例用户(alice) 3. 创建访问策略 4. 评估策略并记录审计日志 5. 生成系统快照(保存到 `/docs/snapshot.json`) 提示:演示程序默认使用 JSON 存储(`~/.sm9_privacy_access/data/store.json`)。 ### 运行可视化仪表盘(Streamlit) ```bash streamlit run sm9_privacy_access/dashboard.py ``` 打开浏览器后: 1. 在左侧栏选择 **存储后端**: - SQLite(`/data/store.db`) - JSON(`/data/store.json`) 2. 进入【系统】页点击【初始化 / 加载系统】 3. 在【用户 / 策略 / 评估 / 审计 / 数据库】页面完成操作与查看 说明:仪表盘侧边栏的 `project_root` 默认值为当前仓库/项目根目录,因此默认会写入 `/data` 与 `/docs`。 ### ROS2 演示(Ubuntu / ROS2 Humble) 本仓库根目录可以直接作为 colcon workspace(`src/` 下为 ROS2 packages)。 本项目 ROS2 部分包含两个节点: - `access_service`:提供 `/sm9_privacy_access/access_request` 服务。请求参数为 `user_id + data_id + privacy_strength`,按策略返回 `raw/privacy/deny`,并返回 `data_json`(原始/隐私化数据)与可验签 `token`。 - `gazebo_ingest`:订阅 Gazebo 的 `/odom`、`/scan`,并将数据封装为 `MultiModalData` 后写入任务2的加密存储(`SecureDataStore`)。 - 启动时会生成并加密存储 **robot + medical 各 5 条**数据(`robot-0..4`、`medical-0..4`) - 运行时会持续写入 Gazebo 实时数据(`gazebo-`) - 发布最新入库 `data_id` 到 `/sm9_privacy_access/latest_data_id`(仅用于提示 ID) #### 0) 启动 Gazebo(推荐先用 Turtlebot3 跑通) 安装依赖(如已安装可跳过): ```bash sudo apt update sudo apt install -y ros-humble-gazebo-ros-pkgs ros-humble-turtlebot3-gazebo ``` 启动 Turtlebot3 Gazebo(另开终端执行): ```bash source /opt/ros/humble/setup.bash export TURTLEBOT3_MODEL=burger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py ``` 确认 topic 存在(应看到 `/odom`、`/scan`): ```bash ros2 topic list -t ``` ```bash # 1) source ROS2 环境 source /opt/ros/humble/setup.bash # 2) 在 workspace 根目录构建 colcon build --symlink-install # 3) source workspace source install/setup.bash # 4) 启动 sm9_privacy_access(推荐使用 launch:同时启动 access_service + gazebo_ingest) ros2 launch sm9_privacy_access_ros2 sm9_privacy_access_gazebo_bridge.launch.py ``` 如你的 topic 名称不同(自定义机器人/world),可通过参数覆盖: ```bash ros2 launch sm9_privacy_access_ros2 sm9_privacy_access_gazebo_bridge.launch.py odom_topic:=/your_odom scan_topic:=/your_scan ``` 另开一个终端(同样 source 了 ROS2 + workspace)调用服务。 首先可获取最新入库的 `data_id`(只用于提示 ID): ```bash ros2 topic echo /sm9_privacy_access/latest_data_id --once ``` #### 1) 访问预置的 5+5 加密数据 本项目会在 `gazebo_ingest` 启动时预置并加密存储: - `robot-0..robot-4`(机器人类) - `medical-0..medical-4`(医疗类:包含心率/血压、用药记录、行为日志) 调用服务(返回字段中 `data_json` 为原始/隐私化数据,`token` 为可验签令牌): ```bash # doctor1 访问 medical-0 预期 raw ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'doctor1', data_id: 'medical-0', privacy_strength: 0.9}" # nurse1 访问 medical-0 预期 privacy ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'nurse1', data_id: 'medical-0', privacy_strength: 0.9}" # guest1 访问 medical-0 预期 deny ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'guest1', data_id: 'medical-0', privacy_strength: 0.9}" # admin1 访问 robot-0 预期 raw ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'admin1', data_id: 'robot-0', privacy_strength: 0.9}" ``` 隐私保护说明:当 `mode==privacy` 时,`PrivacyProcessor` 会基于 `privacy_strength` 对轨迹/点云/生命体征/文本字段做噪声或掩码,并在令牌与审计日志中记录所用方法与参数,满足审计追溯。 #### 2) 访问 Gazebo 实时入库数据(可展示“仿真采集 → 加密存储 → 权限裁决”) 当 Gazebo 在运行且 `/odom`、`/scan` 有数据时,`gazebo_ingest` 会持续写入 `gazebo-`。 ```bash # 先获取最新 data_id ros2 topic echo /sm9_privacy_access/latest_data_id --once # 再用该 data_id 发起访问请求 ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'doctor1', data_id: 'gazebo-', privacy_strength: 1.0}" ``` #### 3) 生成权限审计报告(JSON) 审计日志路径取决于你在 launch 中是否传入 `project_root`: - `project_root:=""`:写入工作区/仓库根目录下的 `docs/audit.log` - `project_root:=""`:写入 `/docs/audit.log` 可以使用如下命令生成 embodied_privacy_access 权限审计报告: ```bash # workspace/repo root 模式示例:当你的数据写在 /docs/ 时 python -c "from pathlib import Path; from sm9_privacy_access.embodied_privacy_access.report import generate_audit_report; root=Path('.'); p=root/'docs'/'audit.log'; out=root/'docs'/'embodied_privacy_access_audit_report.json'; generate_audit_report(audit_log_path=p, output_path=out); print(out)" ``` 报告中包含:按用户/角色/资源/data_id/policy_id 的统计,以及逐条访问明细(含隐私参数与命中策略)。 说明:ROS2 节点在 `project_root:=""` 时会把运行数据写入当前工作区/仓库根目录(`data/` 与 `docs/`)。 ### 运行测试 说明:为避免与 ROS2 测试混淆,直接运行 `pytest` 时默认不会自动收集 `tests/`. 如果需要运行保留的 Python 单测,请使用下方命令。 本项目推荐通过 `run_tests.py` 运行测试(它会: 1) 按任务筛选;2) 输出 durations(用例耗时);3) 输出 JUnit XML;4) 输出中文报告)。 ```bash # 运行任务1测试(SM9 密钥管理) python run_tests.py --task task1 # 运行 embodied_privacy_access 测试(隐私保护与访问控制) python run_tests.py --task embodied_privacy_access # 运行全部测试 python run_tests.py --task all # 或者直接运行 legacy tests pytest tests ``` 测试产物默认输出到 `docs/`: - `test_report_task1.json` / `test_report_task1_cn.json` / `test_report_task1_cn.md` - `test_report_embodied_privacy_access.json` / `test_report_embodied_privacy_access_cn.json` / `test_report_embodied_privacy_access_cn.md` - `junit_task1.xml` / `junit_embodied_privacy_access.xml` / `junit_all.xml` 说明:运行测试时,为避免污染本机环境,存储(`store.json`/`audit.log`/加密数据文件)通常写在 pytest 的临时目录(`tmp_path`)中,不会默认创建 `~/.sm9_privacy_access/`. 测试产物仍输出到仓库的 `docs/`(并已在 `.gitignore` 中忽略)。 A: 在创建 `KeyManager` 时传入不同的存储后端: ```python # 使用JSON存储 store = JsonStorage(path, integrity_key) # 使用SQLite存储 store = SqliteStorage(path, integrity_key) ``` 如果使用 Streamlit 仪表盘,可以在左侧栏直接切换。 ### Q: 如何修改密码短语? A: 在创建 `KeyManager` 时传入新的密码短语: ```python km = KeyManager(..., storage_passphrase="new-passphrase") ``` 注意:修改密码短语后,需要重新初始化系统或使用相同的密码短语才能访问已有数据。 ### Q: 如何查看审计日志? A: 审计日志是JSON Lines格式,可以使用文本编辑器或JSON工具查看: ```bash # 查看最后10条日志 tail -n 10 ~/.sm9_privacy_access/docs/audit.log # 使用jq格式化查看(如果已安装) cat ~/.sm9_privacy_access/docs/audit.log | jq . ``` ## 开发指南 ### 代码风格 - 使用类型注解(Type Hints) - 遵循PEP 8代码风格 - 关键代码都有详细注释 ### 扩展开发 1. **添加新的存储后端** 本仓库根目录可以直接作为 colcon workspace(`src/` 下为 ROS2 packages)。 本项目 ROS2 部分包含两个节点: - `access_service`:提供 `/sm9_privacy_access/access_request` 服务。请求参数为 `user_id + data_id + privacy_strength`,按策略返回 `raw/privacy/deny`,并返回 `data_json`(原始/隐私化数据)与可验签 `token`。 - `gazebo_ingest`:订阅 Gazebo 的 `/odom`、`/scan`,并将数据封装为 `MultiModalData` 后写入任务2的加密存储(`SecureDataStore`)。 - 启动时会生成并加密存储 **robot + medical 各 5 条**数据(`robot-0..4`、`medical-0..4`) - 运行时会持续写入 Gazebo 实时数据(`gazebo-`) - 发布最新入库 `data_id` 到 `/sm9_privacy_access/latest_data_id`(仅用于提示 ID) #### 0) 启动 Gazebo(推荐先用 Turtlebot3 跑通) 安装依赖(如已安装可跳过): ```bash sudo apt update sudo apt install -y ros-humble-gazebo-ros-pkgs ros-humble-turtlebot3-gazebo ``` 启动 Turtlebot3 Gazebo(另开终端执行): ```bash source /opt/ros/humble/setup.bash export TURTLEBOT3_MODEL=burger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py ``` 确认 topic 存在(应看到 `/odom`、`/scan`): ```bash ros2 topic list -t ``` ```bash # 1) source ROS2 环境 source /opt/ros/humble/setup.bash # 2) 在 workspace 根目录构建 colcon build --symlink-install # 3) source workspace source install/setup.bash # 4) 启动 sm9_privacy_access(推荐使用 launch:同时启动 access_service + gazebo_ingest) ros2 launch sm9_privacy_access_ros2 sm9_privacy_access_gazebo_bridge.launch.py ``` 如你的 topic 名称不同(自定义机器人/world),可通过参数覆盖: ```bash ros2 launch sm9_privacy_access_ros2 sm9_privacy_access_gazebo_bridge.launch.py odom_topic:=/your_odom scan_topic:=/your_scan ``` 另开一个终端(同样 source 了 ROS2 + workspace)调用服务。 首先可获取最新入库的 `data_id`(只用于提示 ID): ```bash ros2 topic echo /sm9_privacy_access/latest_data_id --once ``` #### 1) 访问预置的 5+5 加密数据 本项目会在 `gazebo_ingest` 启动时预置并加密存储: - `robot-0..robot-4`(机器人类) - `medical-0..medical-4`(医疗类:包含心率/血压、用药记录、行为日志) 调用服务(返回字段中 `data_json` 为原始/隐私化数据,`token` 为可验签令牌): ```bash # doctor1 访问 medical-0 预期 raw ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'doctor1', data_id: 'medical-0', privacy_strength: 0.9}" # nurse1 访问 medical-0 预期 privacy ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'nurse1', data_id: 'medical-0', privacy_strength: 0.9}" # guest1 访问 medical-0 预期 deny ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'guest1', data_id: 'medical-0', privacy_strength: 0.9}" # admin1 访问 robot-0 预期 raw ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'admin1', data_id: 'robot-0', privacy_strength: 0.9}" ``` 隐私保护说明:当 `mode==privacy` 时,`PrivacyProcessor` 会基于 `privacy_strength` 对轨迹/点云/生命体征/文本字段做噪声或掩码,并在令牌与审计日志中记录所用方法与参数,满足审计追溯。 #### 2) 访问 Gazebo 实时入库数据(可展示“仿真采集 → 加密存储 → 权限裁决”) 当 Gazebo 在运行且 `/odom`、`/scan` 有数据时,`gazebo_ingest` 会持续写入 `gazebo-`。 ```bash # 先获取最新 data_id ros2 topic echo /sm9_privacy_access/latest_data_id --once # 再用该 data_id 发起访问请求 ros2 service call /sm9_privacy_access/access_request sm9_privacy_access_interfaces/srv/AccessRequest "{user_id: 'doctor1', data_id: 'gazebo-', privacy_strength: 1.0}" ``` #### 3) 生成权限审计报告(JSON) 审计日志路径取决于你在 launch 中是否传入 `project_root`: - `project_root:=""`:写入工作区/仓库根目录下的 `docs/audit.log` - `project_root:=""`:写入 `/docs/audit.log` 可以使用如下命令生成 embodied_privacy_access 权限审计报告: ```bash # workspace/repo root 模式示例:当你的数据写在 /docs/ 时 python -c "from pathlib import Path; from sm9_privacy_access.embodied_privacy_access.report import generate_audit_report; root=Path('.'); p=root/'docs'/'audit.log'; out=root/'docs'/'embodied_privacy_access_audit_report.json'; generate_audit_report(audit_log_path=p, output_path=out); print(out)" ``` 报告中包含:按用户/角色/资源/data_id/policy_id 的统计,以及逐条访问明细(含隐私参数与命中策略)。 说明:ROS2 节点在 `project_root:=""` 时会把运行数据写入当前工作区/仓库根目录(`data/` 与 `docs/`)。 ### 运行测试 说明:为避免与 ROS2 测试混淆,直接运行 `pytest` 时默认不会自动收集 `tests/`. 如果需要运行保留的 Python 单测,请使用下方命令。 本项目推荐通过 `run_tests.py` 运行测试(它会: 1) 按任务筛选;2) 输出 durations(用例耗时);3) 输出 JUnit XML;4) 输出中文报告)。 ```bash # 运行任务1测试(SM9 密钥管理) python run_tests.py --task task1 # 运行 embodied_privacy_access 测试(隐私保护与访问控制) python run_tests.py --task embodied_privacy_access # 运行全部测试 python run_tests.py --task all # 或者直接运行 legacy tests pytest tests ``` 测试产物默认输出到 `docs/`: - `test_report_task1.json` / `test_report_task1_cn.json` / `test_report_task1_cn.md` - `test_report_embodied_privacy_access.json` / `test_report_embodied_privacy_access_cn.json` / `test_report_embodied_privacy_access_cn.md` - `junit_task1.xml` / `junit_embodied_privacy_access.xml` / `junit_all.xml` 说明:运行测试时,为避免污染本机环境,存储(`store.json`/`audit.log`/加密数据文件)通常写在 pytest 的临时目录(`tmp_path`)中,不会默认创建 `~/.sm9_privacy_access/`. 测试产物仍输出到仓库的 `docs/`(并已在 `.gitignore` 中忽略)。 A: 在创建 `KeyManager` 时传入不同的存储后端: ```python # 使用JSON存储 store = JsonStorage(path, integrity_key) # 使用SQLite存储 store = SqliteStorage(path, integrity_key) ``` 如果使用 Streamlit 仪表盘,可以在左侧栏直接切换。 ### Q: 如何修改密码短语? A: 在创建 `KeyManager` 时传入新的密码短语: ```python km = KeyManager(..., storage_passphrase="new-passphrase") ``` 注意:修改密码短语后,需要重新初始化系统或使用相同的密码短语才能访问已有数据。 ### Q: 如何查看审计日志? A: 审计日志是JSON Lines格式,可以使用文本编辑器或JSON工具查看: ```bash # 查看最后10条日志 tail -n 10 ~/.sm9_privacy_access/docs/audit.log # 使用jq格式化查看(如果已安装) cat ~/.sm9_privacy_access/docs/audit.log | jq . ``` ## 开发指南 ### 代码风格 - 使用类型注解(Type Hints) - 遵循PEP 8代码风格 - 关键代码都有详细注释 ### 扩展开发 1. **添加新的存储后端** - 继承 `StorageBackend` 基类 - 实现所有抽象方法 - 添加完整性校验支持 2. **添加新的策略运算符** - 修改 `policy.py` 中的 `_ALLOWED_NODES` - 更新策略评估逻辑 3. **集成真实的SM9算法** - 修改 `crypto/sm9_backend.py` - 实现 `SM9Backend` 接口 - 当前实现基于 `gmssl-python`(依赖 GmSSL 动态库);如需替换为其它实现,可新增后端并在工厂方法中选择 ## 许可证 本项目采用 **Apache License 2.0** 开源协议。 ### 重要声明 1. **实验性软件**:本项目为实验性研究项目,仅供学习和研究使用,不适用于生产环境或安全关键系统。 2. **密码学实现**:本项目使用 gmssl-python 实现 SM9 算法。使用者需自行: - 验证密码学实现的正确性和安全性 - 遵守当地密码学法规和出口管制规定 - 在生产部署前进行独立安全审计 3. **隐私与数据保护**:本软件处理敏感数据(生物特征、医疗记录、位置数据等)。使用者必须: - 遵守适用的数据保护法律(GDPR、HIPAA 等) - 实施适当的数据存储和传输安全措施 - 获得必要的数据处理授权和同意 - 根据法律要求进行隐私影响评估 4. **无安全保证**:虽然本软件实现了隐私保护和访问控制机制,但贡献者不对系统的安全性或隐私保证做任何担保。使用者需自行承担使用本软件的所有风险。 5. **第三方依赖**:本项目依赖第三方库(gmssl-python、cryptography 等),使用者需审查并遵守所有依赖项的许可证。 6. **研究与教育用途**:本软件设计用于: - 学术研究和教育 - 原型开发和测试 - 算法验证和基准测试 商业使用需要额外评估,可能需要单独的许可安排。 ### 许可证全文 详见 [LICENSE](LICENSE) 文件。 ### 贡献 通过向本项目贡献代码,您同意您的贡献将按照相同的 Apache License 2.0 条款授权,并且您保证您有权提交该贡献。 ## 更新日志 ## 参考资源 - [SM9算法标准](http://www.gmbz.org.cn/) - GmSSL(gmssl-python 依赖的底层库) - [Python cryptography文档](https://cryptography.io/) ## 联系方式 如有问题或建议,请通过以下方式联系: - 提交 Issue:https://gitee.com/silver-guardian/SM9-Embodied-Guardian/issues - 发送邮件至项目维护者 --- **注意**:本项目为实验性质,生产环境使用前请进行充分的安全评估和测试。