Python 中的数字签名,无需 ASN.1 编码



我们需要生成一个没有ASN.1编码的数字签名,以供下游应用程序验证。我们可以通过以下方式在命令行上使用 openssl 来做到这一点:

openssl pkeyutl -sign -inkey keyfile < hash

但是,当我尝试在 Python 中使用数字签名(使用 PyCrypto 库)时,如果没有包含 ASN.1 编码的库,我将无法这样做(也就是说,除非我分叉 PyCrypto 以允许我删除它们)。RSA 库也不允许这样做。我错过了任何Python加密库或命令允许这种灵活性吗?

根据这个答案,您显示的 OpenSSL 命令会产生一个RSASSA-PKCS1-v1_5签名,根据定义,该签名始终包含 ASN.1 DER 编码结构:您的假设并不真正有效。

但是,当哈希算法固定时,没有必要也不建议接收方实现完整的 DER 解析器。它可以只检查是否存在某个字节字符串(以及其他一些填充字节,并在检查最右侧位置的摘要之前)。另一个答案显示了最流行的摘要算法的 DER 编码。

如果您确实不想在签名中包含 ASN.1,则只能切换到 RSASSA-PSS

最新更新