2013-09-16 5 views
5

Ich versuche, einen Weg zum Laden von RSA-Schlüsselpaar zu Openssl nur mit n, e, d zu finden. Laut der openssl-Dokumentation für die RSA können diese Komponenten (p, q, usw.) NULL sein, aber die einzige Funktion zum Laden von Schlüsseln, die ich gefunden habe, ist i2d_RSAPrivateKey/i2d_RSAPublicKey. Leider funktionieren diese Funktionen nur mit Schlüsseln im DER-Format.Wie RSA-Schlüsselpaar ohne p, q, etc laden

Gibt es also eine Möglichkeit, meine Schlüssel (n, e, d) zu laden, außer sie direkt in die RSA-Struktur zu bringen?

Antwort

2

... diese Funktionen funktionieren nur mit Schlüsseln im DER-Format.

OpenSSL app.c den Code hat das Dienstprogramm verwendet Schlüssel aus einer Datei zu laden (für praktische Zwecke, gibt es keinen Unterschied zwischen Datei oder Speicher, weil Sie einen anderen BIO verwenden können). Es ist unten wiedergegeben, und es bietet eine Reihe von Formaten.

Also gibt es eine Möglichkeit, meine Schlüssel (n, e, d) zu laden, außer sie direkt in die RSA-Struktur zu bringen?

In welchem ​​Format sind Ihre Schlüssel gespeichert?


EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, 
        const char *pass, ENGINE *e, const char *key_descrip) 
{ 
    BIO *key=NULL; 
    EVP_PKEY *pkey=NULL; 
    PW_CB_DATA cb_data; 

    cb_data.password = pass; 
    cb_data.prompt_info = file; 

    if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) 
    { 
     BIO_printf(err,"no keyfile specified\n"); 
     goto end; 
    } 
#ifndef OPENSSL_NO_ENGINE 
    if (format == FORMAT_ENGINE) 
    { 
     if (!e) 
      BIO_printf(err,"no engine specified\n"); 
     else 
     { 
      pkey = ENGINE_load_private_key(e, file, 
              ui_method, &cb_data); 
      if (!pkey) 
      { 
       BIO_printf(err,"cannot load %s from engine\n",key_descrip); 
       ERR_print_errors(err); 
      } 
     } 
     goto end; 
    } 
#endif 
    key=BIO_new(BIO_s_file()); 
    if (key == NULL) 
    { 
     ERR_print_errors(err); 
     goto end; 
    } 
    if (file == NULL && maybe_stdin) 
    { 
#ifdef _IONBF 
# ifndef OPENSSL_NO_SETVBUF_IONBF 
     setvbuf(stdin, NULL, _IONBF, 0); 
# endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 
#endif 
     BIO_set_fp(key,stdin,BIO_NOCLOSE); 
    } 
    else 
     if (BIO_read_filename(key,file) <= 0) 
     { 
      BIO_printf(err, "Error opening %s %s\n", 
         key_descrip, file); 
      ERR_print_errors(err); 
      goto end; 
     } 
    if (format == FORMAT_ASN1) 
    { 
     pkey=d2i_PrivateKey_bio(key, NULL); 
    } 
    else if (format == FORMAT_PEM) 
    { 
     pkey=PEM_read_bio_PrivateKey(key,NULL, 
            (pem_password_cb *)password_callback, &cb_data); 
    } 
#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA) 
    else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC) 
     pkey = load_netscape_key(err, key, file, key_descrip, format); 
#endif 
    else if (format == FORMAT_PKCS12) 
    { 
     if (!load_pkcs12(err, key, key_descrip, 
         (pem_password_cb *)password_callback, &cb_data, 
         &pkey, NULL, NULL)) 
      goto end; 
    } 
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4) 
    else if (format == FORMAT_MSBLOB) 
     pkey = b2i_PrivateKey_bio(key); 
    else if (format == FORMAT_PVK) 
     pkey = b2i_PVK_bio(key, (pem_password_cb *)password_callback, 
          &cb_data); 
#endif 
    else 
    { 
     BIO_printf(err,"bad input format specified for key file\n"); 
     goto end; 
    } 
end: 
    if (key != NULL) BIO_free(key); 
    if (pkey == NULL) 
    { 
     BIO_printf(err,"unable to load %s\n", key_descrip); 
     ERR_print_errors(err); 
    } 
    return(pkey); 
} 
Verwandte Themen