【发布时间】:2019-10-01 23:31:33
【问题描述】:
我已根据此 [1] 链接使用 Python 加密库创建了文件签名。这是我正在使用的 sn-p(我省略了将签名序列化为文件的部分。
>>> from cryptography.hazmat.primitives import hashes
>>> from cryptography.hazmat.primitives.asymmetric import padding
>>> message = b"A message I want to sign"
>>> signature = private_key.sign(
... message,
... padding.PSS(
... mgf=padding.MGF1(hashes.SHA256()),
... salt_length=padding.PSS.MAX_LENGTH
... ),
... hashes.SHA256()
... )
问题是当我尝试使用openssl CLI 验证签名文件时,它失败了:
openssl dgst -sha256 \
> -signature sig.sha256 \
> -verify pubkey.pem \
> -sigopt rsa_padding_mode:pss \
> -sigopt rsa_pss_saltlen:-1 \
> -sigopt rsa_mgf1_md:sha256 \
> myfile
Verification Failure
我不确定这里还有什么要检查的。假设我做的一切都是正确的,我唯一不能 100% 确定的是我的 openssl 标志是否正确。也许它们与密码学中的签名过程设置不匹配?
[1]https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#signing
编辑:修复是要么完全删除-sigopt rsa_pss_saltlen,要么将其设置为-sigopt rsa_pss_saltlen:-2,它将盐长度设置为基于PSS块结构(根据https://www.openssl.org/docs/man1.0.2/man1/pkeyutl.html)。
【问题讨论】:
-
通常问题在于消息的编码,例如字节顺序标记,其他编码或行尾。
标签: python openssl cryptography rsa signing