rsa
xv6 上实现 RSA 加密系统调用的完整设计方案
核心设计思路
完整设计参考: rsa
实现真正的安全性:
-
密钥完全隔离
-
私钥永不离开内核:私钥
d存储在进程的内核结构体中,用户空间无法访问。 - 公钥可查询:用户只能获取公钥
(n, e)用于加密。 -
解密必须通过内核:所有解密操作都在内核态完成。
-
进程级密钥管理
-
动态密钥生成算法
-
Miller-Rabin 素性测试:高效判断素数。
- 扩展欧几里得算法:计算模逆元。
- 安全的随机数生成:基于系统时钟和内存地址。
安全特性
a) 进程隔离
// 子进程无法解密父进程的文件
if (pid == 0) { // 子进程
genrsakey(); // 生成新密钥
decryptfile("parent_file"); // 失败!密钥不同
}
b) 权限管理
c) 加密给特定进程
使用流程示例
# 编译并运行
$ make qemu
# 在 xv6 中测试
$ rsatest
=== xv6 Secure RSA System Test ===
Step 1: Generating RSA keypair for current process...
New RSA keypair generated for PID 3
Public key (n=15877, e=17)
(Private key is securely stored in kernel space)
Step 2: Creating test file...
Created file with content: This is a secret message!
Step 3: Forking child process...
[Parent] Encrypting file for myself (PID 3)...
[Parent] Encrypted content (hex): a3 1f 8c 92 ...
[Child] Generating my own RSA keypair...
[Child] My public key: n=18293, e=17
[Child] Attempting to decrypt parent's file...
[Child] ✓ Cannot decrypt - different private key!
[Parent] Decrypting file with my private key...
[Parent] Decrypted content: This is a secret message!
✓ RSA encryption/decryption successful!
✓ Private key never left kernel space!
关键优势
-
真正的安全性
-
私钥物理隔离在内核空间。
- 进程间密钥隔离。
-
无法通过用户空间程序窃取私钥。
-
灵活的密钥管理
-
每个进程独立密钥。
- 动态生成,非硬编码。
-
支持密钥撤销。
-
数学严谨性
-
实现完整的 RSA 算法。
- Miller-Rabin 素性测试。
- 正确的模运算和密钥生成。
可扩展性建议
- 密钥存储优化
- 文件元数据
- 密钥交换协议
数学证明与分析
-
RSA 正确性证明
-
如果 \(c = m^e \mod n\),则 \(m = c^d \mod n\)。
-
使用欧拉定理:\(m^{\phi(n)} \equiv 1 \mod n\)。
-
安全性分析
-
大数分解困难性。
- 离散对数问题。
-
选择明文攻击(CPA)安全性。
-
复杂度分析
-
加密:\(O(\log e)\) 模乘运算。
- 解密:\(O(\log d)\) 模乘运算。
- 空间复杂度:\(O(1)\)。
可选授权/密钥管理方案(按复杂度与安全性排序)
-
内核保管私钥、内核执行解密(最安全、最易演示)
-
私钥永远不出内核空间,用户不能直接读取。
- 用户调用
sys_decrypt_file(path),内核检查权限;若通过,执行解密。 - 优点:私钥不会泄露、易做审计。
-
缺点:内核承担加密工作量。
-
内核密钥库 + 授权票据(中等复杂度,灵活)
-
管理员用
sys_grant_decrypt(target_uid, path, ttl)给用户授予短期授权票据。 - 用户在有效期内调用
sys_decrypt_with_token(path, token_id)。 -
优点:支持细粒度与时限控制。
-
内核存储私钥但通过能力/权限检查(简单)
-
只有特定 UID(如 root)或拥有特定 capability 的进程可以调用
sys_decrypt()。 -
优点:实现最简单,演示清晰。
-
用户态密钥守护进程 + 内核协作(复杂)
-
私钥由用户态守护进程管理,解密请求通过受控 IPC 发送给守护进程。
-
优点:设计接近真实 Linux keyring;缺点实现复杂。
-
硬件绑定密钥(TPM/SEAL,理论方案)
-
私钥封存在可信硬件,只有满足策略环境才能解封。
- 在 xv6 中难以实现。
扩展建议
-
添加密钥管理
-
实现密钥生成系统调用。
-
密钥存储在专用内核结构。
-
支持大文件
-
流式加密。
-
添加进度报告。
-
错误处理增强
-
完整性校验(MAC)。
-
错误恢复机制。
-
性能基准测试
-
不同文件大小的加密时间。
- 与其他加密算法对比。
总结
该实现方案结合了系统编程和数论知识:
- 展示了对 xv6 内核的理解。
- 展示了完整 RSA 算法在内核态的实现。
- 项目规模适中(2–3 周可完成)。
- 具有良好的可扩展性,并适合作为 GitHub 项目进行演示和报告撰写。