xv6 上实现 RSA 加密系统调用的完整设计方案
核心设计思路
完整设计参考: rsa
实现真正的安全性:
-
密钥完全隔离
- 私钥永不离开内核:私钥
d存储在进程的内核结构体中,用户空间无法访问。 - 公钥可查询:用户只能获取公钥
(n, e)用于加密。 - 解密必须通过内核:所有解密操作都在内核态完成。
- 私钥永不离开内核:私钥
-
进程级密钥管理
struct proc {
// 每个进程独有的 RSA 密钥对
struct rsa_keypair rsa_keys;
int key_permissions; // 密钥权限控制
};
- 动态密钥生成算法
- Miller-Rabin 素性测试:高效判断素数。
- 扩展欧几里得算法:计算模逆元。
- 安全的随机数生成:基于系统时钟和内存地址。
安全特性
a) 进程隔离
// 子进程无法解密父进程的文件
if (pid == 0) { // 子进程
genrsakey(); // 生成新密钥
decryptfile("parent_file"); // 失败!密钥不同
}
b) 权限管理
// 可以主动撤销私钥访问权限
sys_revoke_key(); // 之后无法解密
c) 加密给特定进程
// 加密文件只有目标进程能解密
encryptfile("secret.txt", target_pid);
使用流程示例
# 编译并运行
$ 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 素性测试。
- 正确的模运算和密钥生成。
可扩展性建议
- 密钥存储优化
struct key_cache {
int pid;
struct rsa_keypair keys;
struct key_cache *next;
};
- 文件元数据
struct inode {
int encrypted_for_pid; // 记录文件加密目标
uint32 encryption_timestamp;
};
- 密钥交换协议
sys_exchange_keys(int target_pid);
数学证明与分析
-
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()。 - 优点:实现最简单,演示清晰。
- 只有特定 UID(如 root)或拥有特定 capability 的进程可以调用
-
用户态密钥守护进程 + 内核协作(复杂)
- 私钥由用户态守护进程管理,解密请求通过受控 IPC 发送给守护进程。
- 优点:设计接近真实 Linux keyring;缺点实现复杂。
-
硬件绑定密钥(TPM/SEAL,理论方案)
- 私钥封存在可信硬件,只有满足策略环境才能解封。
- 在 xv6 中难以实现。
扩展建议
-
添加密钥管理
- 实现密钥生成系统调用。
- 密钥存储在专用内核结构。
-
支持大文件
- 流式加密。
- 添加进度报告。
-
错误处理增强
- 完整性校验(MAC)。
- 错误恢复机制。
-
性能基准测试
- 不同文件大小的加密时间。
- 与其他加密算法对比。
总结
该实现方案结合了系统编程和数论知识:
- 展示了对 xv6 内核的理解。
- 展示了完整 RSA 算法在内核态的实现。
- 项目规模适中(2–3 周可完成)。
- 具有良好的可扩展性,并适合作为 GitHub 项目进行演示和报告撰写。