如何在Python中使用M2Crypto与特定填充技术签署文档?

2 投票
1 回答
4938 浏览
提问于 2025-04-15 15:40

我需要在Python中使用存储在.pem文件中的私钥对一些文本进行数字签名。现在看来,M2Crypto是实现这个功能的首选方法,所以我就用这个。我觉得大部分内容我都能理解,但对于如何配置填充方式有些困惑。具体来说,我需要在一个iPhone应用中验证签名,使用一种叫做kSecPaddingPKCS1SHA1的填充方案,描述如下:

要签名的数据是一个SHA1哈希。将进行标准的ASN.1填充,以及底层RSA操作的PKCS1填充。

由于我不是加密方面的专家,所以对这是什么意思只有模糊的理解。我尝试查看一些RFC文档,但发现它们很难懂。我看到RSA对象的加密/解密方法需要填充类型,但没有看到与签名验证相关的类似内容。

任何帮助,尤其是代码方面的,将不胜感激。

(从某种意义上说,这个问题是对这个问题的反向提问。)


好的,下面给出的答案是正确的,至少在我看来是这样的。以下代码生成的签名可以在iPhone上使用kSecPaddingPKCS1SHA1填充方案进行验证。

from M2Crypto import EVP
privkey = EVP.load_key("privkey.pem")
privkey.sign_init()
privkey.sign_update(text)
signature = privkey.sign_final()

(抱歉插嘴,但我想说,加密黑客是宇宙中最糟糕的文档写作者之一。)

1 个回答

2

据我所知,M2Crypto在需要的地方会添加填充。

PKCS1填充是默认的填充方式。

不过(再次强调,仅仅是我所知道的),签名是没有填充的,填充只会加在加密的数据上,以防止可能的攻击。
编辑:用户caf在评论中提到,填充对一个好的签名是很重要的。我还是建议你先试试默认的M2Crypto设置,它可能会自动添加填充。

M2Crypto的文档中,你可以看到{public,private}_{encrypt,decrypt}方法有一个填充选项,默认是PKCS1,而签名方法则没有这个选项。

我认为你可以试试默认的M2Crypto参数,可能会有效果。

撰写回答