2013-09-16 27 views
5

我试图找到一种方法,只使用n,e,d将RSA密钥对加载到Openssl。 根据RSA的openssl文档,这些组件(p,q等)可以为NULL,但唯一用于加载我设法找到的密钥的函数是i2d_RSAPrivateKey/i2d_RSAPublicKey。不幸的是,这些功能只适用于DER格式的密钥。如何加载没有p,q等的RSA密钥对

那么有什么方法可以加载我的密钥(n,e,d),除非直接将它们应用到RSA结构中?

回答

2

......这些函数只适用于DER格式的密钥。

OpenSSL的app.c有工具使用从文件加载密钥代码(出于实用目的,有文件或内存没有任何区别,因为你可以使用不同的BIO)。它的转载如下,它提供了一些格式。

那么有什么方法可以加载我的密钥(n,e,d),除非直接将它们应用到RSA结构中?

你的钥匙是什么格式?


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); 
}