OpenSSL中读取PEM文件的问题

openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key

        BIO * key = NULL;
        RSA
* r = NULL;
        key
= BIO_new(BIO_s_file());
        BIO_read_filename(key,
" c:\\private.key " );
        r
= PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);
        BIO_free_all(key);

读取 private key 读取正常,r 并不返回空
使用同样方法读取 public key

        BIO * key = NULL;
        RSA
* r = NULL;
        key
= BIO_new(BIO_s_file());
        BIO_read_filename(key,
" c:\\public.key " );
        r
= PEM_read_bio_RSAPublicKey(key, NULL, NULL, NULL);
        BIO_free_all(key);

不正常, r 总是返回 NULL,将函数改一下 PEM_read_bio_RSA_PUBKEY
  r1 = PEM_read_bio_RSA_PUBKEY(key1, NULL,NULL,NULL);
  openssl_to_keys(r, 1024, priv, pub);
r1 读取成功

附:

openssl之PEM系列之8---PEM对象读写IO函数(二)
    ---根据openssl源代码、SSLeay Documents以及其它相关材料写成
    (作者:DragonKing, Mail: [email protected] ,发布于:http://openssl.126.com之openssl专业论坛,版本:openssl-0.9.7)
    本文继续介绍PEM对象的读写IO函数,请参看《openssl之PEM系列之7》以便更好理解本文。
    【符合PKCS#8和PKCS#5 v2.0标准的私钥对象PKCS8PrivateKey的IO】
    int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);
    这两个函数使用PKCS#8标准保存EVP_PKEY里面的私钥到文件或者BIO中,并采用PKCS#5
v2.0的标准加密私钥。enc参数定义了使用的加密算法。跟其他PEM的IO函数不一样的是,本函数的加密是基于PKCS#8层次上的,而不是基于PEM信息字段的,所以这两个函数也是单独实现的函数,而不是宏定义函数。如果enc参数为NULL,那么就不会执行加密操作,只是使用PKCS#8私钥 信息
结构。成功执行返回大于0 的数,否则返回0。
    使用这两个函数保存的PEM对象可以使用上篇文章介绍的PEM_read_bio_PrivateKey或PEM_read_PrivateKey读出来。
    下面是一个将私钥保存为PKCS#8格式,并使用3DES算法进行加密,使用的口令是"hello"的例子
    if (!PEM_write_bio_PKCS8PrivateKey(bp, key, EVP_des_ede3_cbc(), NULL, 0, 0, "hello"))
    {
     /*出错处理代码*/
    }
    【符合PKCS#8和PKCS#5 v1.5或PKCS#12标准的私钥对象PKCS8PrivateKey的IO】
    int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);
    这两个函数也是单独实现的函数,而不是宏定义函数。他们也是将私钥保存成PKCS#8格式,但是采用的方式是PKCS#5 v1.5或者PKCS#12进行私钥的加密。nid参数指定了相应的加密算法,其值应该为相应对象的NID。成功执行返回大于0 的数,否则返回0。
    使用这两个函数保存的PEM对象可以使用上篇文章介绍的PEM_read_bio_PrivateKey或PEM_read_PrivateKey读出来。
    【公钥对象PUBKEY的IO】
    EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);
    EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
    int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x);
    这四个函数对EVP_PKEY结构的公钥进行PEM格式的读写处理。公钥是作为SubjectPublicKeyInfo存储结构进行编码的。
    【RSA私钥对象RSAPrivateKey的IO】
    RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
    这四个函数对RSA结构的RSA私钥进行PEM格式的读写处理。它使用跟PrivateKey相同的函数进行处理,但如果私钥类型不是RSA,就会返回错误信息。
    【RSA公钥对象RSAPublicKey的IO】
    RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
    int PEM_write_RSAPublicKey(FILE *fp, RSA *x);
    这四个函数是对RSA结构的公钥进行PEM格式的读写处理。本函数使用PKCS#1 RSAPublicKey结构标准对RSA公钥进行编码操作。
    【RSA公钥对象RSA_PUBKEY的IO】
    RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);
    int PEM_write_RSA_PUBKEY(FILE *fp, RSA *x);
    这四个函数也是对RSA结构的公钥进行PEM格式的读写处理。但是本函数使用SubjectPublicKeyInfo结构标准对RSA公钥进行编码操作,如果公钥类型不是RSA,就出错返回失败信息。

 

转自: http://lengyuefei.blogbus.com/logs/60576945.html

 

你可能感兴趣的:(算法,加密,IO,File,null,FP)