2016-10-07 7 views
2

Ich habe folgende (sehr vereinfachtes) Code, der OpenSSL verwendet einen verschlüsselten privaten Schlüssel zu erzeugen, eine Schnur mit einem null als Passwort enthält:einen privaten Schlüssel mit einem Null-enthaltenden Passwort verschlüsselt Entschlüsseln

#include <stdio.h> 
#include <openssl/rsa.h> 
#include <openssl/evp.h> 
int main(int argc, char *argv[]) { 
    char password[32] = "pass\000word"; 
    extern FILE *stdout; 
    EVP_PKEY *key = NULL; 
    RSA *rsa; 

    SSL_library_init(); 
    OpenSSL_add_all_algorithms(); 

    rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); 
    key = EVP_PKEY_new(); 

    EVP_PKEY_assign(key, EVP_PKEY_RSA, rsa); 

    /* Write the private key to the file */ 
    PEM_write_PrivateKey(stdout, key, EVP_des_ede3_cbc(), (unsigned char*)password, 32, NULL, NULL); 
    return 0; 
} 

Der verschlüsselte private Schlüssel wird wie erwartet erstellt, ich kann ihn jedoch weder programmgesteuert mithilfe von PEM_read_PrivateKey(3ssl) noch über die Befehlszeile mithilfe von openssl pkcs8 -in key.pam -passin file:key.pass entschlüsseln.

$ od -ta key.pass 
0000000 p a s s nul w o r d nul nul nul nul nul nul nul 
0000020 nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul 
0000040 

Von dem, was ich sehen kann, nimmt PEM_read_PrivateKey nur ein null terminierte Passwort ein, im Gegensatz zu PEM_write_PrivateKey.

Wie ist es möglich, den generierten Schlüssel zu entschlüsseln?

+0

Haben Sie versucht, ein tatsächliches Passwort * callback * anstelle von NULL zu verwenden und die Passphrase anzugeben? Die Dokumente für das cb-Argument (und noch wichtiger, es weglassen) sind ziemlich klar: "Wenn die cb-Parameter auf NULL gesetzt sind und der u-Parameter nicht NULL ist, wird der u-Parameter als null-terminierte Zeichenfolge interpretiert Passphrase: Wenn sowohl cb als auch u NULL sind, wird die Standard-Callback-Routine verwendet, die normalerweise nach der Passphrase auf dem aktuellen Terminal mit ausgeschaltetem Echo fragt ". – WhozCraig

+0

Ich habe keine benutzerdefinierte Rückruffunktion versucht, und die Standardfunktion, die das Terminal verwendet, scheint Nullen zu ignorieren. Ich werde sehen, ob ich etwas Brauchbares peitschen und zurückmelden kann. – Ron

+0

Es scheint zu funktionieren. Mir ist nicht eingefallen, den Rückruf zu benutzen. Zum Schämen. Ich werde es mit meinem realen Problem versuchen und die Antwort genehmigen, wenn es funktioniert. Vielen Dank. – Ron

Antwort

2

Verwenden Sie den Caller-Callback, um Ihre Passwort-Bereitstellung durchzuführen. Hier finden Sie völlige brutale Gewalt, scheußlich, hat keine Fehlerprüfung, und in keine Weise beispielhaft für meine Codierung Gewohnheiten, sondern zeigt, was ich bin auf:

#include <stdio.h> 
#include <string.h> 
#include <openssl/rsa.h> 
#include <openssl/evp.h> 
#include <openssl/pem.h> 

int password_cb (char *buf, int size, int rwflag, void *userdata) 
{ 
    memcpy(buf, userdata, 32); 
    return 32; 
} 

int main(int argc, char *argv[]) 
{ 
    char password[32] = "pass\0word"; 
    EVP_PKEY *key = NULL; 
    RSA *rsa; 

    OpenSSL_add_all_algorithms(); 

    rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); 
    key = EVP_PKEY_new(); 

    EVP_PKEY_assign(key, EVP_PKEY_RSA, rsa); 

    /* Write the private key to the file */ 
    FILE *fp = fopen("somekey.pem", "w"); 
    PEM_write_PrivateKey(fp, key, EVP_aes_128_cbc(), (unsigned char*)password, sizeof(password), NULL, NULL); 
    fclose(fp); 


    EVP_PKEY* rdkey = NULL; 
    fp = fopen("somekey.pem", "r"); 
    PEM_read_PrivateKey(fp, &rdkey, password_cb, password); 
    fclose(fp); 

    PEM_write_PrivateKey(stdout, key, NULL, NULL, 0, NULL, NULL); 
    PEM_write_PrivateKey(stdout, rdkey, NULL, NULL, 0, NULL, NULL); 

    return 0; 
} 

es sollte die verschlüsselten Schlüssel zu somekey.pem Dump, lese den verschlüsselten Schlüssel von somekey.pem mit der gleichen Passphrase und lege schließlich beide Schlüssel auf stdout ab. Die beiden unverschlüsselt stdout Schlüssel war besser gleich sein ... Und sie sind:

Beispielausgabe

-----BEGIN RSA PRIVATE KEY----- 
MIIEpAIBAAKCAQEAoHDPXfbdKEZDmLsxPNlWY3gBGzG69p0vTrhRZEzO09p5kZ35 
T1y9cZAig+lEgY7U/trDWh0d1ABSfsLwT/dv2AAeBE2+avYE+v1jyr6N3FzFXS2O 
jKOTkUy+Xw54aAlYHh4S8/K41rrxjcL7cjORWojl+4ZTfGLqCZE8Ga6c41MxBM9v 
8ky9Kh2Tnf1zMnGk3Xd69jKnfsZyz7pzeNAZ8g0lezDt8r8b472fXTW2rnwezhTR 
YsAbBjoP+P2JhNIQEHXXoTLqflQMfX34TTQLzg5OYOpNNezSqEFh9lFRvnE5B6h+ 
ov7qF+KyWT17dZMrywd2M6ixVFi3u6JbR/E/9QIDAQABAoIBAGhsZBtVVGYlLVPX 
6lkfX+HHtnibqoNelO7YemkcsLUkimFjf2PPCaJDXKOcjLECZNEnU2RwdPyJ5SeJ 
+10gwBPHJ8JHU3tMertddrj7w1s8qlxWDWSuBprYZ0N5KJcWFdssWcubHADulc9d 
q8iNlbpmRcGqkOXxf0AQ3hwdERHHCLgJzB9Djlurwine1Xs33ZQkr0DecHRS5Unr 
IbH9YLKQvGzdohrQfDTSntf/79wxdKRjdiAvPv5AQMz4lrEKYKLp+4B0j3kRq3LN 
mokNdCcuhVJKuuN8s4C8EaBYByfWJbzVG2ZqHyoF0Zy1eFkTrXKoaExdv1q37Q3r 
hVtD8CECgYEA0YD7sLkrt9WhTIMc0oUdeLLcpI6vvbmJtdkM1bUm/hpacG4VvpJs 
Y/Txw4qHydCcbFIh4EyhuEcvnHrbFReyqWB25hLDnsOT/js76xbdJFVN+g7B+pCb 
DfDv7LMKf8iJjVO+W5gnxxCrTrW9YbLs11vZUYcMnzySnsHYHtD7/C0CgYEAxAxK 
EwkkTMvT0AvyBK6d+EzZPwcSpokWMqs8K2iGdQiGWuvCvrwaSPFOWS54RXx0Cm7j 
iE5Nx5U1OXrA2iTwxTMXjcbHHL0mZ5KJIIP+qSu7839hK1b4bx45k0rjiDH5O+we 
8y6gAh7Ni+T+7U2LqVBBMVbNzUycTztDshwxh+kCgYEAmCKpIykkhSe+LRidCocd 
4rNIJLt1BTpBtWs7tckJ2sZ6XGCkq7Iawe9yzQPBHZ2+qa5u6TncyjvvaBuTElsW 
I4docCS6J4Vw59JN7aa5yhOkP20OEg2Ge3Y2VFWjzy1qLdXdSxhP8m+5Zrv1HYhY 
Ev+g7WI7mTrcYirz7VTnV7UCgYEAqXRR5qhFNxgLSk248HEaXA/Yy9DKPyZJCJzX 
0lFzvt8Seq5D02d1dM0WwqEXFkCfcJEunJfKRRPkQH2pCiVZ86nY1xQU8PNRqb6Q 
Romw6frCZ5MXo0V2UV2XuIfHqeZAHppWmi4X4h1L33qdGvKnID8dSo9ULfrlNNru 
BZq2+VkCgYBV9wCdkG9CeqpJ2ZrEE4S7ZKUzbQY2nRpLTVp4fS07iE19XGoe+mZH 
xFdR7t6mCqddY1SJ5qbKta0I4ibUw5LpaG0odVduqbJmIJskSyocVfQPd7qfoIch 
Fku3d1WZiU4DNudSglSf2PIzw6S7Lp1Lp6n5wDzdxF3uJFYv1twlVQ== 
-----END RSA PRIVATE KEY----- 
-----BEGIN RSA PRIVATE KEY----- 
MIIEpAIBAAKCAQEAoHDPXfbdKEZDmLsxPNlWY3gBGzG69p0vTrhRZEzO09p5kZ35 
T1y9cZAig+lEgY7U/trDWh0d1ABSfsLwT/dv2AAeBE2+avYE+v1jyr6N3FzFXS2O 
jKOTkUy+Xw54aAlYHh4S8/K41rrxjcL7cjORWojl+4ZTfGLqCZE8Ga6c41MxBM9v 
8ky9Kh2Tnf1zMnGk3Xd69jKnfsZyz7pzeNAZ8g0lezDt8r8b472fXTW2rnwezhTR 
YsAbBjoP+P2JhNIQEHXXoTLqflQMfX34TTQLzg5OYOpNNezSqEFh9lFRvnE5B6h+ 
ov7qF+KyWT17dZMrywd2M6ixVFi3u6JbR/E/9QIDAQABAoIBAGhsZBtVVGYlLVPX 
6lkfX+HHtnibqoNelO7YemkcsLUkimFjf2PPCaJDXKOcjLECZNEnU2RwdPyJ5SeJ 
+10gwBPHJ8JHU3tMertddrj7w1s8qlxWDWSuBprYZ0N5KJcWFdssWcubHADulc9d 
q8iNlbpmRcGqkOXxf0AQ3hwdERHHCLgJzB9Djlurwine1Xs33ZQkr0DecHRS5Unr 
IbH9YLKQvGzdohrQfDTSntf/79wxdKRjdiAvPv5AQMz4lrEKYKLp+4B0j3kRq3LN 
mokNdCcuhVJKuuN8s4C8EaBYByfWJbzVG2ZqHyoF0Zy1eFkTrXKoaExdv1q37Q3r 
hVtD8CECgYEA0YD7sLkrt9WhTIMc0oUdeLLcpI6vvbmJtdkM1bUm/hpacG4VvpJs 
Y/Txw4qHydCcbFIh4EyhuEcvnHrbFReyqWB25hLDnsOT/js76xbdJFVN+g7B+pCb 
DfDv7LMKf8iJjVO+W5gnxxCrTrW9YbLs11vZUYcMnzySnsHYHtD7/C0CgYEAxAxK 
EwkkTMvT0AvyBK6d+EzZPwcSpokWMqs8K2iGdQiGWuvCvrwaSPFOWS54RXx0Cm7j 
iE5Nx5U1OXrA2iTwxTMXjcbHHL0mZ5KJIIP+qSu7839hK1b4bx45k0rjiDH5O+we 
8y6gAh7Ni+T+7U2LqVBBMVbNzUycTztDshwxh+kCgYEAmCKpIykkhSe+LRidCocd 
4rNIJLt1BTpBtWs7tckJ2sZ6XGCkq7Iawe9yzQPBHZ2+qa5u6TncyjvvaBuTElsW 
I4docCS6J4Vw59JN7aa5yhOkP20OEg2Ge3Y2VFWjzy1qLdXdSxhP8m+5Zrv1HYhY 
Ev+g7WI7mTrcYirz7VTnV7UCgYEAqXRR5qhFNxgLSk248HEaXA/Yy9DKPyZJCJzX 
0lFzvt8Seq5D02d1dM0WwqEXFkCfcJEunJfKRRPkQH2pCiVZ86nY1xQU8PNRqb6Q 
Romw6frCZ5MXo0V2UV2XuIfHqeZAHppWmi4X4h1L33qdGvKnID8dSo9ULfrlNNru 
BZq2+VkCgYBV9wCdkG9CeqpJ2ZrEE4S7ZKUzbQY2nRpLTVp4fS07iE19XGoe+mZH 
xFdR7t6mCqddY1SJ5qbKta0I4ibUw5LpaG0odVduqbJmIJskSyocVfQPd7qfoIch 
Fku3d1WZiU4DNudSglSf2PIzw6S7Lp1Lp6n5wDzdxF3uJFYv1twlVQ== 
-----END RSA PRIVATE KEY----- 

Hoffnung, das ist das, was Sie suchen.

Verwandte Themen