2012-12-17 22 views
9

Ecco come lo farei con phpseclib (che funziona):rimozione della password di RSA chiave privata

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->setPassword('password'); 
$result = $rsa->loadKey('-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb 
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q 
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q 
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2 
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo 
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a 
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS 
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk 
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk 
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI 
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY-----'); 

echo $result ? 'true' : 'false'; 
?> 

A scopo di confronto, però, sto cercando di farlo con OpenSSL. Ecco il mio codice:

<?php 
$pkey = openssl_pkey_get_private('-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb 
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q 
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q 
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2 
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo 
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a 
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS 
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk 
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk 
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI 
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY-----', 'password'); 
if ($pkey === false) exit('FAILURE'); 
openssl_pkey_export($pkey, $out_key_file); 
echo $out_key_file; 
?> 

Unico problema: il codice muore prematuramente, echo'ing fuori GUASTO. vale a dire. openssl_pkey_get_private() non sta caricando la chiave. openssl_error_string dice "errore: 0906D066: routine PEM: PEM_read_bio: cattiva linea di fondo".

Qualche idea?

+5

Spero che questa particolare chiave che hai pubblicato non è quella che si prevede da usare per tenere i cibi sicuri =) – paddy

+2

@paddy doh! >. < –

+2

Forse la password della "password" che sta usando per la chiave che ha postato è una password che usa universalmente. Forse ha postato la sua password StackOverflow: P – neubert

risposta

8

Non sono sicuro di cosa sta succedendo qui; Ho provato il codice e dà lo stesso problema, così ho creato la chiave me stesso:

openssl genrsa -des3 -out des3.rsa 

quindi copiato il contenuto in questo script:

$out_key_file = 'des3nopass.rsa'; 

$key = <<<EOS 
-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,5F2FDB4C8F710F92 

pkaBIMCdnvrejw6egagg/lGrrGJWLsceDkC0KSdouRfR8LhQS/XjSJ/Wqrj7fa36 
xXRd/USBebgy2hLAi9RMPofOjlcUyUVvZZgh0+JDQ79pH5q1FsRMcsJ+J8GO0edw 
kh8zdZoCbbtJgQjTx0JheJMDdZymw4cfK5hoZbnxX6HZ1wNhtPb7Z/noNcxpK6Zl 
CCzPgLd9hCGLBD2XqoRjOM1U2vpZwpCTdYgAtFIPMVXQQpzgIyw06CHcHvYZgnAc 
oxiVx7Z7N9r0J1vDnlrW/OU1l07D0pBr1yPRTDMI5tBMo8KDsL2tkBxqtYyOJdZr 
as/5zQDPRlbW7Jve1JuXmsnja+gN7jZ+3LpUzfRFo/wWnvOzhHQxLz+RaUpVDYTl 
F4m9zjo9dgOhlZzigOhYTB+5aq5f92Yf6K0daCwTDpU= 
-----END RSA PRIVATE KEY----- 
EOS; 

$pkey = openssl_pkey_get_private($key, 'password'); 
if ($pkey === false) { 
     die(openssl_error_string()); 
} 

openssl_pkey_export($pkey, $out_key_file); 
echo "Wrote to $out_key_file\n"; 

e che funziona bene per me .

Aggiornamento

Ho cercato di eseguire questa utilizzando la linea openssl ordine così, utilizzando la chiave:

openssl rsa -in des3big.rsa -out des3bignopass.rsa 
unable to load Private Key 
14179:error:0906D066:PEM routines:PEM_read_bio:bad end line:pem_lib.c:746: 

Sembra che OpenSSL ha un problema con esso pure, quindi è non PHP.

Update 2

scopre che le linee sono troppo lunghi (che dovrebbe essere di 64 caratteri di larghezza):

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2Rxo 
bDjhlOOzqmTbVrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLb 
gBb9tRpWh5IlXulKD6XFhx8q/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3 
OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8QO7URxnVnHLltaFvIxshqyZu92xbU 
YZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2E1D3iDS94wRgx0Tj 
v4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAoxko+ 
lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFh 
Qj2Cze+a9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqw 
zF8J317JlsdKoBFDw8mSMxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJc 
ran/6wHwP88pVM2odiHkpnrJGcEBbbIkqsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTH 
MPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlkMDapowb+Is77+a9Y2VDs 
OXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyIFqox8Ahk 
v3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY----- 
+5

OMG OpenSSL è così schizzinoso.Nuova riga alla fine, le righe devono essere lunghe 64 caratteri, ecc. Bella scoperta però! –

1

potrebbe trovare ulteriori informazioni, cercando in causa dell'errore:

if ($pkey === false) { 
    echo openssl_error_string(); 
    exit('FAILURE'); 
} 

Edit: Dato l'errore "PEM_read_bio: brutta fine linea" qui è la porzione della fonte di OpenSSL che innesca:

[...] 
if ((strncmp(buf,"-----END ",9) != 0) || 
     (strncmp(nameB->data,&(buf[9]),i) != 0) || 
     (strncmp(&(buf[9+i]),"-----\n",6) != 0)) { 

     PEMerr(PEM_F_PEM_READ_BIO,PEM_R_BAD_END_LINE); 
     goto err; 
     } 
[...] 

Guardando il tuo codice sospetto che avrai bisogno di un carattere di fine riga aggiunto alla fine della stringa della chiave privata.

+0

Dice "errore: 0906D066: routine PEM: PEM_read_bio: cattiva fine linea" –

+0

questo potrebbe aiutare: http://edokan.wordpress.com/2011/10/22/error0906d066pem-routinespem_read_biobad- end-line/- l'autore suggerisce di terminare con una riga feed char – Nathan

+0

ho appena cercato l'errore in openssl sources e infatti ci deve essere una newline come ultimo carattere nella stringa – Nathan

Problemi correlati