xv6 上实现 RSA 加密系统调用的完整设计方案


核心设计思路

完整设计参考: rsa

实现真正的安全性:

  1. 密钥完全隔离

    • 私钥永不离开内核:私钥 d 存储在进程的内核结构体中,用户空间无法访问。
    • 公钥可查询:用户只能获取公钥 (n, e) 用于加密。
    • 解密必须通过内核:所有解密操作都在内核态完成。
  2. 进程级密钥管理

struct proc {
    // 每个进程独有的 RSA 密钥对
    struct rsa_keypair rsa_keys;
    int key_permissions;  // 密钥权限控制
};
  1. 动态密钥生成算法
  • 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!

关键优势

  1. 真正的安全性

    • 私钥物理隔离在内核空间。
    • 进程间密钥隔离。
    • 无法通过用户空间程序窃取私钥。
  2. 灵活的密钥管理

    • 每个进程独立密钥。
    • 动态生成,非硬编码。
    • 支持密钥撤销。
  3. 数学严谨性

    • 实现完整的 RSA 算法。
    • Miller-Rabin 素性测试。
    • 正确的模运算和密钥生成。

可扩展性建议

  1. 密钥存储优化
struct key_cache {
    int pid;
    struct rsa_keypair keys;
    struct key_cache *next;
};
  1. 文件元数据
struct inode {
    int encrypted_for_pid;  // 记录文件加密目标
    uint32 encryption_timestamp;
};
  1. 密钥交换协议
sys_exchange_keys(int target_pid);

数学证明与分析

  1. RSA 正确性证明

    • 如果 $c = m^e \mod n$,则 $m = c^d \mod n$。
    • 使用欧拉定理:$m^{\phi(n)} \equiv 1 \mod n$。
  2. 安全性分析

    • 大数分解困难性。
    • 离散对数问题。
    • 选择明文攻击(CPA)安全性。
  3. 复杂度分析

    • 加密:$O(\log e)$ 模乘运算。
    • 解密:$O(\log d)$ 模乘运算。
    • 空间复杂度:$O(1)$。

可选授权/密钥管理方案(按复杂度与安全性排序)

  1. 内核保管私钥、内核执行解密(最安全、最易演示)

    • 私钥永远不出内核空间,用户不能直接读取。
    • 用户调用 sys_decrypt_file(path),内核检查权限;若通过,执行解密。
    • 优点:私钥不会泄露、易做审计。
    • 缺点:内核承担加密工作量。
  2. 内核密钥库 + 授权票据(中等复杂度,灵活)

    • 管理员用 sys_grant_decrypt(target_uid, path, ttl) 给用户授予短期授权票据。
    • 用户在有效期内调用 sys_decrypt_with_token(path, token_id)
    • 优点:支持细粒度与时限控制。
  3. 内核存储私钥但通过能力/权限检查(简单)

    • 只有特定 UID(如 root)或拥有特定 capability 的进程可以调用 sys_decrypt()
    • 优点:实现最简单,演示清晰。
  4. 用户态密钥守护进程 + 内核协作(复杂)

    • 私钥由用户态守护进程管理,解密请求通过受控 IPC 发送给守护进程。
    • 优点:设计接近真实 Linux keyring;缺点实现复杂。
  5. 硬件绑定密钥(TPM/SEAL,理论方案)

    • 私钥封存在可信硬件,只有满足策略环境才能解封。
    • 在 xv6 中难以实现。

扩展建议

  1. 添加密钥管理

    • 实现密钥生成系统调用。
    • 密钥存储在专用内核结构。
  2. 支持大文件

    • 流式加密。
    • 添加进度报告。
  3. 错误处理增强

    • 完整性校验(MAC)。
    • 错误恢复机制。
  4. 性能基准测试

    • 不同文件大小的加密时间。
    • 与其他加密算法对比。

总结

该实现方案结合了系统编程和数论知识:

  • 展示了对 xv6 内核的理解。
  • 展示了完整 RSA 算法在内核态的实现。
  • 项目规模适中(2–3 周可完成)。
  • 具有良好的可扩展性,并适合作为 GitHub 项目进行演示和报告撰写。