python - 如何在python中使用数字签名算法RSASSA-PSS-2048-SHA256

标签 python rsa digital-signature sha

我正在尝试在 python2.7 中查找 RSASSA-PSS-2048-SHA256 数字签名算法。

目前我的代码是这样的:

def calc_rsassa_pss_2048_sha256(self, data):
    private_key = RSA.importKey(self.private_key)
    cipher = PKCS1_v1_5.new(private_key)
    h = SHA.new(data)
    signature = cipher.sign(h)
    return base64.b64encode(signature)

但是当我们尝试验证生成的签名时出现签名不匹配错误。

Java 中的代码如下:

public static PrivateKey decodePrivateKey(String privateKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException {
    String privateKeyRaw = trimPrivateKey(privateKeyStr);
    byte[] buffer = decodeBase64(privateKeyRaw);
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
}

public static String sha256withRSAPSS(String privateKeyStr, String content) throws InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    PrivateKey privateKey = decodePrivateKey(privateKeyStr);
    Signature signature = Signature.getInstance("SHA256withRSA/PSS", new BouncyCastleProvider());
    signature.initSign(privateKey);
    signature.update(content.getBytes(CHARSET));
    return encodeBase64(signature.sign());
}

不知道上面的python签名代码有什么问题。或者如何在python2.7中使用RSASSA-PSS-2048-SHA256算法?

非常感谢。

最佳答案

在 Python 部分,您使用 PKCS#1 v1.5 填充进行签名。在您使用 PSS 的 Java 部分。当您使用不同的方案时,这两个方案不会产生相同的输出是很自然的。一般更推荐使用PSS scheme over v1.5。

我不是 Python 专家,但在互联网上快速浏览后,也许 Hazmat 加密库可以帮助你在 Python 上使用它 ( https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/ ):

>>> 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()
... )

编辑:如果 Hazmat 不适合您,请在此处查看已批准的答案:PKCS1_PSS sign() method

关于python - 如何在python中使用数字签名算法RSASSA-PSS-2048-SHA256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53511961/

相关文章:

python - 来自 `gensim` 的 LDA(潜在狄利克雷分配)推理如何处理新数据?

c++ - 使用 crypto++ 库验证 openssl 签名

java - 共享和存储 RSA - Java 服务器中的公钥,反之亦然

swift - 如何在 macOS 上使用 Security.framework 解密数据?

ios - 我已经使用 mupdf 将图像插入到 pdf 数字签名层 n2 中,但它没有显示出来

python - 使用 ECB 模式加密解密字节时出现问题

python - list_value 不能包含包含另一个 list_value 的 Value

python - 使用node.js创建RSA签名并使用python进行验证

Java - 使用 ECDSA(椭圆曲线)创建 XML 数字签名

python - 如何使用 LXML 编写命名空间元素属性?