Как использовать алгоритм цифровой подписи RSASSA-PSS-2048-SHA256 в питоне - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь найти алгоритм цифровой подписи RSASSA-PSS-2048-SHA256 в python2.7.

В настоящее время мой код выглядит так:

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 выше.Или как использовать алгоритм RSASSA-PSS-2048-SHA256 в python2.7?

Большое спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

В части Python вы используете для подписи PKCS # 1 v1.5.На части Java вы используете PSS.Поскольку вы используете разные схемы, вполне естественно, что эти две не будут давать одинаковый результат.Как правило, более рекомендуется использовать схему PSS над 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 () метод *) 1010 *

...