php - Python 密码学 : Cannot sign with RSA private key using PKCS1v15 padding

标签 php python cryptography pkcs#1

我正在尝试使用 Python 和加密库实现与 PHP 的 openssl_pkey_get_privateopenssl_sign 使用 SHA1 哈希的功能等效的签名。我读过 PHP 使用 PKCS1v15 填充,所以这也是我正在尝试使用的。我的代码是:

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

执行此结果:

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

最佳答案

运算符isinstance 表示padding.PKCS1v15 需要是一个实例而不是类型(类)本身。这意味着应该通过调用构造函数来创建对象实例。

为此添加括号,即 padding.PKCS1v15()

关于php - Python 密码学 : Cannot sign with RSA private key using PKCS1v15 padding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39304533/

相关文章:

php - XAMPP 1.8.0、MercuryMail 和 mail() 在收件箱中没有收到邮件

python - 如何解析 .shp 文件?

C:如何得到一个4096位的质数?

php - 我的 session 变量是如何在远程页面上定义的?只是对背景知识感到好奇

php - 使用 PHP DOM 在 html 标记的开头插入创建的元​​素

完成后自行删除的php脚本

c - 修改 Ext4 文件系统写入磁盘的数据

python - 在 Django 中找不到静态文件错误

Python 拆分忽略逗号

随机数分析