密码软件与实现与密钥安全之密钥安全方案

发布时间 2024-01-03 20:46:11作者: 20201327刘谨铭

基于寄存器的密钥安全方案

原理

确保密钥数据只以明文形态储存在cpu寄存器上

安全目标

1.密钥长期储存寄存器

  • 特权资源,不被用户态访问;
  • 除加解密任务外不访问该寄存器

2.密钥初始化
3.加解密计算过程

安全性分析

基于寄存器的对称密码算法实现采用多重安全措施,有效抵御冷启动攻击,将密钥长期存储在特权寄存器中,并通过原子操作、系统补丁等手段避免泄露到内存。方案防范只读DMA攻击,但对于读写DMA和内核态软件攻击存在一定潜在风险,同时通过无密钥相关跳转提高了对侧信道攻击的防御。

基于寄存器的公钥密码算法实现方案

1)初始化:进行口令派生算法计算 AES 主密,并将AES 主密钥安全存储在特权寄存器中。
2)RSA 私钥解密:在从内存中接收到 RSA 计算请求时,从外部读取加密的 RSA 密钥在 CPU 中将RSA私行解密,并将明文形态的 RSA私钥临时存放在寄存器上。
3)RSA计算:在通用寄存器上完成 RSA 计算过程。

难点:仅用寄存器完成涉及大量中间变量的RSA计算
1.全寄存器

  • Montgomery乘法

2.寄存器 + 内存加密

  • 加密内存空间的构建
  • Montgomery乘法实现
  • 模幂实现
  • RSA实现

基于寄存器的密钥安全方案对比

基于Cache的密钥安全方案

原理

利用Cache代替内存进行计算和储存(Cache As RAM),确保敏感数据只以明文形态出现在寄存器和Cache中

密钥架构步骤

  • 1.从用户输入的口令中导出主密钥并复制到每个 CPU 核的调试寄存器中。
  • 2.从硬盘将加密的私钥读入内存。
  • 3.需要进行私钥操作时,将主密钥从调试寄存器中载入 Cache。
  • 4.加密的私钥被载入 Cache。
  • 5.私钥被主密钥解密来进行密码计算。
  • 6.如果在签名时需要 DRBG(随机数发生器),那么DRBG种子先被解密,再生成随机比特,并更新DRBG 内部状态。随后敏感信息被擦除。

基于Cache的安全计算环境构建

  • 1.从被TRESOR机制保护的调试寄存器载人主密钥。
  • 2.由AES主密钥初始化AES 计算上下文。
  • 3.加密的私钥被主密钥解密。
  • 4.使用私钥构造私钥上下文。
  • 5.进行所请求的私钥操作,其中,在计算 ECDSA时,DRBG子需要被解密来生成随机比特,然后更新。
  • 6.输出被写回内存

系统实现

CAR技术实现

1.执行保护环境

struct CACHE CRYPTO ENV{
  unsigned char masterKey[128/8];
  AES CONTEXT aes;
  union {
    RSA rsaCtx;
    ECDSA{
      ECDSA KEY ecdsaKey;
      unsigned char mallocBuffer[DMEM SIZE];
  } ecdsaCtx;
  }pkcontext;
  DRBG drbg;
  PRECOMPUTATION TABLE table;
  unsigned char CacheStack[CSTACK SIZE];
  unsigned long privKeyId;
  unsigned char input[MAX IN LENGTH];
  unsigned char output[MAX OUT LENGTH];
}CacheCryptoEnv;

2.L1 D-Cache使用
计算过程中,保证整个CacheCryptoEnvironment都在L1 D-Cache中。
3.栈切换

4.原子性

  • 调用preempt_disable()禁止内核抢占
  • 调用local_irq_save()关闭可屏蔽中断,阻止上下文切换发生

5.对SMP支持

密码算法实现

  • RSA
  • DRBG
  • ECDSA

用户接口

通过ioctl系统调用请求服务

  • 1.获取私钥的数量。
  • 2.根据密钥唯一标识符(privateKeyId)指定的密对做私运算。
  • 3.根据密钥对来获取公信息,包括算法标识符和公钥