Ipotesi # 1
Dopo aver guardato al codice sorgente, penso, ho risolto il mistero. Il modo in cui l'importazione funziona per le chiavi PEM crittografate con una password è che il PEM viene decrittografato su DER e dopo che viene chiamata la funzione importKeyDER. Se la password fornita non è corretta, anche il formato della rappresentazione DER generata non sarà corretto e otterresti un'eccezione che hai fornito. Per confermare che, ho eseguito due test rapidi di seguito:
>>> from Crypto.PublicKey import RSA
>>> f = open('<some-path>/private-key.pem','r')
>>> r=RSA.importKey(f.read(),passphrase='foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line 665, in importKey
return self._importKeyDER(der)
File "/usr/local/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line 588, in _importKeyDER
raise ValueError("RSA key format is not supported")
ValueError: RSA key format is not supported
>>> f = open('<some-path>/private-key.pem','r')
>>> r=RSA.importKey(f.read(),passphrase='<valid-pass-phrase>')
>>> r
<_RSAobj @0xb7237b2c n(4096),e,d,p,q,u,private>
Dopo aver ricevuto la PEM da parte dell'autore, mi sono reso conto che Ipotesi # 1 non è valida per il suo caso. Voglio ancora tenerlo qui come una possibile ragione di errore di importazione, quindi altri utenti sono a conoscenza.
Ipotesi n. 2 - questo è il caso dell'autore.
RSA.py cerca il seguente nel file PEM per determinare quale tipo di crittografia è stato applicato alla PEM:
Proc-Type: 4,ENCRYPTED
Quando il tasto viene generato utilizzando "OpenSSL genrsa ..." di comando, questa stringa è presente in PEM in chiaro, tuttavia quando viene utilizzato "opensl genpkey ..." il "Proc-Type" non è presente.
RSA.py non prova nemmeno a decifrare il PEM se il "Proc-Type" non si trova:
# The encrypted PEM format
if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')):
DEK = lines[2].split(b(':'))
....
Quindi, la mia conclusione in questo momento è che le chiavi generate da "OpenSSL genpkey" non sono supportati da PyCrypto v 2.6.1.
Aggiornamento importante
E funziona nella versione più recente di 2.7a1 pycrypto. Potete scaricarlo da qui: http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.7a1.tar.gz
>>> f = open('key.pem','r')
>>> r = RSA.importKey(f.read(), passphrase='123456')
>>> r
<_RSAobj @0xb6f342ec n(2048),e,d,p,q,u,private>
interessante, a giudicare dalla traccia dello stack si sta tentando di importarlo in formato binario DER, non in PEM.Sei sicuro di fornire il file corretto? –