【问题标题】:How to use digital signature algorithm RSASSA-PSS-2048-SHA256 in python如何在python中使用数字签名算法RSASSA-PSS-2048-SHA256
【发布时间】:2019-04-29 22:03:29
【问题描述】:

我正在尝试在 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 rsa digital-signature sha


    【解决方案1】:

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

    我不是 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()
    ... )
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多