2016-08-02 15 views
0

M2Crypto(0.22.6rc4)を使用しています。 OpenSCプロジェクトのengine_pkcs11と、データの暗号化と復号化を行うトークンベースの認証用のAladdin PKIクライアントを使用したいと思います。私は、データを暗号化しますが、ときに私はRSA_pubのインスタンスと、このエラーを取得解読しようとすることができますいくつかの理由M2CryptoとUSBトークンを使用する際の助けが必要

from M2Crypto import Engine, m2, RSA, BIO 

slot_id = "slot_01" 
pin = "password" 
dynamic = Engine.load_dynamic_engine("pkcs11", "/usr/lib/ssl/engines/libpkcs11.so") 
pkcs11 = Engine.Engine("pkcs11") 
pkcs11.ctrl_cmd_string("MODULE_PATH", "/usr/lib/watchdata/ICP/lib/libwdpkcs_icp.so") 
pkcs11.init() 
r = pkcs11.ctrl_cmd_string("PIN", pin) 

pubkey = pkcs11.load_public_key(slot_id, pin) 
priv = pkcs11.load_private_key(slot_id, pin) 
enc = pubkey.get_rsa().public_encrypt("teste", RSA.pkcs1_oaep_padding) 
dec = priv.get_rsa().private_decrypt(enc, RSA.pkcs1_oaep_padding) 
print dec 

File "pkcs11.py", line 14, in <module> 
    dec = priv.get_rsa().private_decrypt(enc, RSA.pkcs1_oaep_padding) 
    File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 279, in private_decrypt 
    raise RSAError, 'RSA_pub object has no private key' 
M2Crypto.RSA.RSAError: RSA_pub object has no private key 

任意の助けをいただければ幸いです!

答えて

0

RSA秘密鍵のM2Cryptoラッピングにバグがあります。回避策は、低レベルのM2Crypto APIを使用して秘密鍵オブジェクトに直接アクセスすることです。

def decrypt(cipher_text): 
    # Load the key using high level API 
    engine = Engine.Engine('pkcs11') 
    engine.init() 
    key_slot = 'slot_1-id_01' 
    privKey = engine.load_private_key(key_slot) 

    # Get a pointer to the low level API object 
    rsa_ptr = m2.pkey_get1_rsa(privKey.pkey) 
    rsaWrapper = RSA.RSA(rsa_ptr, 1) 

    # Decrypt with low level API 
    results = m2.rsa_private_decrypt(rsaWrapper.rsa, ciphertext, 1) 
関連する問題