2016-09-03 22 views
3

私はPythonと機能的に同等の署名を実装しようとしており、暗号化ライブラリはPHPのopenssl_pkey_get_privateopenssl_signにSHA1ハッシュを使用して実装しています。私はPHPがPKCS1v15パディングを使用していることを読んだので、これも私が使用しようとしているものです。私のコードは次のとおりオペレータisinstancepadding.PKCS1v15インスタンス代わりの種類(クラス)自体する必要があることを示しているPython暗号化:PKCS1v15パディングを使用してRSA秘密鍵で署名できません

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

どの暗号化ライブラリのバージョンを使用していますか? –

+0

バージョン1.4と1.5で試しました。 – Marii

+0

PSS埋め込みで試しましたか?また、脆弱性のために新しいアプリケーションにPKCS1v15パディングを使用することは推奨されません。 https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#cryptography.hazmat.primitives.asymmetric.padding.PKCS1v15 –

答えて

3

:でこれを実行

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

結果。つまり、コンストラクタを呼び出すことによってオブジェクトインスタンスを作成する必要があります。

これを行うには、かっこを追加します(例:padding.PKCS1v15())。

関連する問題