TMS320F28377S: 28377S RSA签名验签

Part Number: TMS320F28377S
Other Parts Discussed in Thread: C2000WARE, SHA-256

TI博主好:

我现在需要在28377S上进行RSA算法的验签工作,目前遇到两个问题:

1.我用官方库函数进行签名生成然后再调用验签此时是可以通过的,但我用同样的私钥对同样的数据进行在线或者openssl签名为什么和官方的签名不一样,这让我很费解,hash256的值都是对的。

 有疑问的点还有EM的长度为什么加hash256的32个字节只有62 ,按道理应该等于rsa2048也就是256个字节。

2.签名的执行时长特别长有没有硬件加速办法,或者我现在只需要验签不需要签名。我只是想了解下这个芯片可以有加速的办法不。

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 你好,

    你使用的是哪个版本的c2000ware?

    1. TI库与OpenSSL之间的签名不匹配

    根本原因几乎可以肯定是填充方案的差异。

    TI C2000 RSA 库(来自 C2000Ware 安全示例)使用 简化/非标准 PKCS#1 v1.5 填充 在某些实现中。具体来说:

    • 您的 62 字节 EM 观测结果证实了这一点。  使用 SHA-256 进行 RSA-2048 编码的标准 PKCS#1 v1.5 编码消息应该完全  256 字节 结构如下:

      0x00 | 0x01 | [0xFF padding...] | 0x00 | DigestInfo(SHA-256) | Hash(32 bytes)
      

      其中 DigestInfo 会添加一个 19 字节的 ASN.1 前缀,使总数达到 DigestInfo + Hash = 51 bytes其余部分是 0xFF 填充至 256 字节。

    • 如果你的 EM 编码只有 62 字节,TI 库很可能构建的是一个截断的或未填充的编码——可能只是 DigestInfo (19 bytes) + padding header (11 bytes) + hash (32 bytes) = 62 bytes  — 而不延伸到完整的模量长度。

    为什么 OpenSSL 会生成不同的签名:   OpenSSL 会根据 PKCS#1 v1.5 标准(或使用 PSS)正确地将 EM 填充到完整的 256 字节模数长度。TI 库可能使用了专有编码或简化编码。

    分辨率选项:

    • 修改您的验证码以使用 完整的 PKCS#1 v1.5 编码  (用填充 EM 到 256 字节)  0xFF 在传递给模幂函数之前,先将字节传递给函数。
    • 或者,您也可以使用 TI 库的大数函数自行执行原始的 RSA 数学运算(模幂运算),并手动处理填充/编码以匹配 OpenSSL 的输出。

    2. 性能/硬件加速

    F28377S  它没有专用的加密硬件加速器。RSA 运算完全在 C28x 内核上以软件方式运行。

    加快验证速度的选项:

    方法 影响
    使用公共指数 e = 65537 (0x10001) 验证比签名快得多,因为使用较小的公共指数进行幂运算所需的乘法次数要少得多。
    优化大数乘法 使用汇编优化的例程;TI 的 IQmath 或手工调整的 32 位乘法链
    减小键长 RSA-1024 的速度比 RSA-2048 快约 4 倍(安全性较低,但取决于您的威胁模型)。
    切换至 ECDSA 在 C28x 上,ECDSA-P256 验证速度明显快于 RSA-2048(操作数更小)。
    以最高时钟频率(200 MHz)运行 确保在加密操作期间 PLL 配置为全速运行
    预先计算蒙哥马利参数 如果使用同一个公钥验证多个签名,则只需计算一次蒙哥马利常数。

    仅用于验证,使用 e=65537 的 RSA 算法应在以下范围内完成:   100–500毫秒 在 200 MHz 频率下,F28377S 芯片上运行 RSA-2048 算法的运行时间取决于实现质量。如果运行时间长达数秒,则可能是实现中没有使用高效的模幂运算(例如,缺少蒙哥马利乘法或滑动窗口技术)。