使用 pkcs#11 api 使用 RSA 对 sha256 哈希进行签名?

Sign sha256 hash with RSA using pkcs#11 api?

我目前正在使用 pyPkcs11 来签署文件。

以下调用适用于使用 RSA 和 sha256 对常见文件进行签名,

session.sign(privKey, toSign, Mechanism(CKM_SHA256_RSA_PKCS, None)

但是我的一些文件已经过哈希处理 (sha256),签名需要提供与此 openSSL 命令相同的输出:

openssl pkeyutl -sign -pkeyopt digest:sha256 -in <inFilePath> -inkey <keyPath> -out <outFilePath>

我试过下面的调用,它不会在签名前生成文件的哈希值,

session.sign(privKey, toSign, Mechanism(CKM_RSA_PKCS, None)

但是结果不是我所期望的,根据这个post的第一个回答CKM_RSA_PKCS vs CKM_RSA_X_509 mechanisms in PKCS#11

CKM_RSA_PKCS on the other hand also performs the padding as defined in the PKCS#1 standards. This padding is defined within EMSA-PKCS1-v1_5, steps 3, 4 and 5. This means that this mechanism should only accept messages that are 11 bytes shorter than the size of the modulus. To create a valid RSASSA-PKCS1-v1_5 signature, you need to perform steps 1 and 2 of EMSA-PKCS1-v1_5 yourself.

经过一些研究,我的文件似乎包含 RFC 3447 描述的签名的第一步,因此缺少的部分是第二步,即生成 ASN.1 值的地方。

我可以用 pkcs11 强制执行这个操作吗?

PKCS#11 documentation 似乎没有包含任何相关信息。

恐怕没有PKCS#11功能,可以为所欲为。

我知道的唯一解决方案是,手动将 PKCS#1 v1.5 填充应用于您的哈希,然后使用 CKM_RSA_X_509[=15 对块进行签名=](原始或教科书RSA)机制。

我看到有两种方法可以做到这一点;合适的取决于令牌(并非所有 tokens/wrappers 都执行所有机制)。

  • 如本 , you could decorate the 32-octet SHA-256 that you start from into a full padded message representative. Basically, as explained in PKCS#1 中所述,如果 RSA 密钥是 k 个八位字节(我假设 k≥51+11=62个八位字节,即一个public模数至少8⋅62-7=489位,这是安全必须的),你

    1. 在左边追加 19 个八位字节的字符串
      30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20
      产生一个 51 字节的字符串,它实际上是哈希类型和每个值的 ASN.1 DER 编码
      DigestInfo ::= SEQUENCE {
          digestAlgorithm DigestAlgorithm,
          digest OCTET STRING
      }
      
    2. 再在左边追加k-51个字节的字符串(其中k-51-3是FF)
      00 01 FF FF FF FF..FF FF FF FF 00
      产生一个 k-octet string
    3. 用机制CKM_RSA_X_509签名(长度k个八位字节)。
  • 或者,或者:按照 [1.] 执行;跳过 [2.];在 [3.] 中使用机制 CKM_RSA_PKCS(长度 51 个八位字节)。

免责声明:我没有检查过,最近也没有使用过 PKCS#11 设备。

注意:虽然没有针对其正确实施的已知攻击,但使用 PKCS#1 v1.5 签名填充越来越令人不悦;例如French authorities recommend

RecomSignAsym-1.   Il est recommandé d’employer des mécanismes de signature asymétrique disposant d’une preuve de sécurité.

或者,英文:

It is recommended to use asymmetric signature mechanisms featuring a security proof

他们提到了 RSA-SSA-PSS (sic)。作为奖励,该机制的 PKCS#11 实现是 CKM_RSA_PKCS_PSS 机制,它接受哈希,而不是要签名的数据,从而使要求变得微不足道。