Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1072051
  • 博文数量: 252
  • 博客积分: 4561
  • 博客等级: 上校
  • 技术积分: 2833
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-15 08:23
文章分类

全部博文(252)

文章存档

2015年(2)

2014年(1)

2013年(1)

2012年(16)

2011年(42)

2010年(67)

2009年(87)

2008年(36)

分类:

2010-05-04 18:01:08

OpenSSL中读取PEM文件的问题 - [OpenSSL]

2010-03-15

:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://lengyuefei.blogbus.com/logs/60576945.html

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

        BIO  * key  =  NULL; 
        RSA 
* =  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 
*= 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: wzhah@263.net ,发布于:之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,就出错返回失败信息。


阅读(13635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~