rsa - 使用 pkcs#11 api 使用 RSA 签署 sha256 哈希?

标签 rsa pkcs#11

我目前正在使用 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)

但是结果不是我预期的,根据这篇文章的第一个答案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似乎没有包含任何相关信息。

最佳答案

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

  • 如本文所述 other answer ,您可以将开始的 32 字节 SHA-256 装饰为完整填充的消息代表。基本上,如 PKCS#1 for RSASSA-PKCS1-v1_5 中所述引用EMSA-PKCS1-v1_5 ,如果 RSA key 是 k 个八位字节(我假设 _k_≥51+11=62 个八位字节,这是一个至少 8⋅62-7=489 位的公共(public)模数,这是安全所必需的), 你
    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八位字节字符串 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(原文如此)。作为奖励,该机制的 PKCS#11 实现是 CKM_RSA_PKCS_PSS 机制,它接受哈希值,而不是要签名的数据,从而使所要求的内容变得微不足道。

关于rsa - 使用 pkcs#11 api 使用 RSA 签署 sha256 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47106122/

相关文章:

伪代码中的加密算法

python - 值错误: Ciphertext length must be equal to key size

java - 解密用RSA java加密的 “long”消息

javascript - Web Crypto API 无法导入 openssl key

java - 无法使用 IAIK PKCS11 包装器加载 PKCS11 驱动程序

c++ - 从 PKCS11 读取 C++ 结构有什么问题?

c - 在 Linux 上连接硬件安全模块

c# - 我正在尝试创建 GOST 3410 公钥。 CKR ATTRIBUTE_TYPE INVALID 异常

c# - .net 中的 JWT 生成和验证抛出 "Key is not supported"