跳转至

rsa

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


核心设计思路

完整设计参考: rsa

实现真正的安全性:

  1. 密钥完全隔离

  2. 私钥永不离开内核:私钥 d 存储在进程的内核结构体中,用户空间无法访问。

  3. 公钥可查询:用户只能获取公钥 (n, e) 用于加密。
  4. 解密必须通过内核:所有解密操作都在内核态完成。

  5. 进程级密钥管理

struct proc {
    // 每个进程独有的 RSA 密钥对
    struct rsa_keypair rsa_keys;
    int key_permissions;  // 密钥权限控制
};
  1. 动态密钥生成算法

  2. Miller-Rabin 素性测试:高效判断素数。

  3. 扩展欧几里得算法:计算模逆元。
  4. 安全的随机数生成:基于系统时钟和内存地址。

安全特性

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. 进程间密钥隔离。
  4. 无法通过用户空间程序窃取私钥。

  5. 灵活的密钥管理

  6. 每个进程独立密钥。

  7. 动态生成,非硬编码。
  8. 支持密钥撤销。

  9. 数学严谨性

  10. 实现完整的 RSA 算法。

  11. Miller-Rabin 素性测试。
  12. 正确的模运算和密钥生成。

可扩展性建议

  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 正确性证明

  2. 如果 \(c = m^e \mod n\),则 \(m = c^d \mod n\)

  3. 使用欧拉定理:\(m^{\phi(n)} \equiv 1 \mod n\)

  4. 安全性分析

  5. 大数分解困难性。

  6. 离散对数问题。
  7. 选择明文攻击(CPA)安全性。

  8. 复杂度分析

  9. 加密:\(O(\log e)\) 模乘运算。

  10. 解密:\(O(\log d)\) 模乘运算。
  11. 空间复杂度:\(O(1)\)

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

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

  2. 私钥永远不出内核空间,用户不能直接读取。

  3. 用户调用 sys_decrypt_file(path),内核检查权限;若通过,执行解密。
  4. 优点:私钥不会泄露、易做审计。
  5. 缺点:内核承担加密工作量。

  6. 内核密钥库 + 授权票据(中等复杂度,灵活)

  7. 管理员用 sys_grant_decrypt(target_uid, path, ttl) 给用户授予短期授权票据。

  8. 用户在有效期内调用 sys_decrypt_with_token(path, token_id)
  9. 优点:支持细粒度与时限控制。

  10. 内核存储私钥但通过能力/权限检查(简单)

  11. 只有特定 UID(如 root)或拥有特定 capability 的进程可以调用 sys_decrypt()

  12. 优点:实现最简单,演示清晰。

  13. 用户态密钥守护进程 + 内核协作(复杂)

  14. 私钥由用户态守护进程管理,解密请求通过受控 IPC 发送给守护进程。

  15. 优点:设计接近真实 Linux keyring;缺点实现复杂。

  16. 硬件绑定密钥(TPM/SEAL,理论方案)

  17. 私钥封存在可信硬件,只有满足策略环境才能解封。

  18. 在 xv6 中难以实现。

扩展建议

  1. 添加密钥管理

  2. 实现密钥生成系统调用。

  3. 密钥存储在专用内核结构。

  4. 支持大文件

  5. 流式加密。

  6. 添加进度报告。

  7. 错误处理增强

  8. 完整性校验(MAC)。

  9. 错误恢复机制。

  10. 性能基准测试

  11. 不同文件大小的加密时间。

  12. 与其他加密算法对比。

总结

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

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