简体   繁体   English

Python密码术:无法使用PKCS1v15填充使用RSA私钥进行签名

[英]Python Cryptography: Cannot sign with RSA private key using PKCS1v15 padding

I'm trying to implement a functionally equivalent signing with Python and the Cryptography library to PHP's openssl_pkey_get_private and openssl_sign using a SHA1 hash. 我正在尝试使用Python和openssl_sign使用SHA1哈希来实现与Python和Cryptography库的功能等效签名到PHP的openssl_pkey_get_privateopenssl_sign I've read that PHP uses PKCS1v15 padding, so that's what I'm trying to use as well. 我已经读过PHP使用PKCS1v15填充,所以这也是我想要使用的。 My code is: 我的代码是:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key
from cryptography.hazmat.backends import default_backend

pk = open('key.pem', 'rb')
key = load_pem_private_key(pk.read(), password=None, backend=default_backend())
message = b'hello world'
signature = key.sign(
    message,
    padding.PKCS1v15,
    hashes.SHA1()
)

Executing this results in: 执行此操作会导致:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-ef3db8a6f4a8> in <module>()
      3     message,
      4     padding.PKCS1v15,
----> 5     hashes.SHA1()
      6 )

/home/vagrant/virtualenvs/test/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/rsa.py in sign(self, data, padding, algorithm)
    613 
    614     def sign(self, data, padding, algorithm):
--> 615         signer = self.signer(padding, algorithm)
    616         signer.update(data)
    617         signature = signer.finalize()

/home/vagrant/virtualenvs/test/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/rsa.py in signer(self, padding, algorithm)
    550 
    551     def signer(self, padding, algorithm):
--> 552         return _RSASignatureContext(self._backend, self, padding, algorithm)
    553 
    554     def decrypt(self, ciphertext, padding):

/home/vagrant/virtualenvs/test/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/rsa.py in __init__(self, backend, private_key, padding, algorithm)
    170 
    171         if not isinstance(padding, AsymmetricPadding):
--> 172             raise TypeError("Expected provider of AsymmetricPadding.")
    173 
    174         self._pkey_size = self._backend._lib.EVP_PKEY_size(

TypeError: Expected provider of AsymmetricPadding.

The operator isinstance indicates that padding.PKCS1v15 needs to be an instance instead of the type (class) itself. 运算符isinstance指示padding.PKCS1v15需要是实例而不是类型(类)本身。 That means that the object instance should be created by calling the constructor. 这意味着应该通过调用构造函数来创建对象实例。

To do this add parentheses, ie padding.PKCS1v15() . 为此,添加括号,即padding.PKCS1v15()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM