调用OPENSSL读取PEM文件的灵异问题
来源:互联网 发布:清华大学软件学院考研 编辑:程序博客网 时间:2024/06/11 17:08
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);
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);
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
BIO *key1=NULL;
RSA *r1=NULL;
key1=BIO_new(BIO_s_file());
if(BIO_read_filename(key1,"c:\\public.key") <= 0 )
{
printf("error\n");
}
r1 = PEM_read_bio_RSA_PUBKEY(key1, NULL,NULL,NULL);
BIO_free_all(key1);
openssl_to_keys(r, 1024, priv, pub);
r1 读取成功
具体原因未知
作者: playmud 时间: 2009-08-24 11:53:00
让我们先来看一下pem.h头文件中的定义:
#define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u)
#define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u)
#define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u)
#define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u)
对应的很工整是不是,你生成一个私钥,然后用它生成一个公钥。
openssl genrsa -out private.pem 1024
openssl rsa -in priv.pem -pubout -out public.pem
用任何一种方法打开私钥,读取私钥信息,得到RSA,查看RSA,ok,没有问题,一切都还看起来比较正常。
然后用任何一种方法打开公钥,读取公钥信息,问题出现了:RSA对象为空,你失败了。
通过openssl的手册和帮助,你会发现两个函数:
PEM_read_bio_RSA_PUBKEY()
PEM_read_RSA_PUBKEY()
他们才是你要找的对应的,而上面两个函数是从任何.h里面找不到的,但是他们的确是真实存在的符号连接,在对应的.o文件中用objdump可以查看到他们的符号,很诡异!
现象描述完了,还未探其究竟。
让我们先来看一下pem.h头文件中的定义:
#define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u)
#define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u)
#define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u)
#define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u)
对应的很工整是不是,你生成一个私钥,然后用它生成一个公钥。
openssl genrsa -out private.pem 1024
openssl rsa -in priv.pem -pubout -out public.pem
用任何一种方法打开私钥,读取私钥信息,得到RSA,查看RSA,ok,没有问题,一切都还看起来比较正常。
然后用任何一种方法打开公钥,读取公钥信息,问题出现了:RSA对象为空,你失败了。
通过openssl的手册和帮助,你会发现两个函数:
PEM_read_bio_RSA_PUBKEY()
PEM_read_RSA_PUBKEY()
他们才是你要找的对应的,而上面两个函数是从任何.h里面找不到的,但是他们的确是真实存在的符号连接,在对应的.o文件中用objdump可以查看到他们的符号,很诡异!
现象描述完了,还未探其究竟。
附加读取 PEM file 的code
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);
R_RSA_PRIVATE_KEY priv;
R_RSA_PUBLIC_KEY pub;
openssl_to_keys(r, 1024, priv, pub);
BIO *key1=NULL;
RSA *r1=NULL;
key1=BIO_new(BIO_s_file());
if(BIO_read_filename(key1,"c:\\public.key") <= 0 )
{
printf("error\n");
}
r1 = PEM_read_bio_RSA_PUBKEY(key1, NULL,NULL,NULL);
BIO_free_all(key1);
openssl_to_keys(r, 1024, priv, pub);
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);
R_RSA_PRIVATE_KEY priv;
R_RSA_PUBLIC_KEY pub;
openssl_to_keys(r, 1024, priv, pub);
BIO *key1=NULL;
RSA *r1=NULL;
key1=BIO_new(BIO_s_file());
if(BIO_read_filename(key1,"c:\\public.key") <= 0 )
{
printf("error\n");
}
r1 = PEM_read_bio_RSA_PUBKEY(key1, NULL,NULL,NULL);
BIO_free_all(key1);
openssl_to_keys(r, 1024, priv, pub);
static void bn_to_bin(BIGNUM* bn, unsigned char* bin, int n) {
memset(bin, 0, n);
int m = BN_num_bytes(bn);
BN_bn2bin(bn, bin+n-m);
}
void openssl_to_keys(
RSA* rp, int nbits, R_RSA_PRIVATE_KEY& priv, R_RSA_PUBLIC_KEY& pub
) {
pub.bits = nbits;
bn_to_bin(rp->n, pub.modulus, sizeof(pub.modulus));
bn_to_bin(rp->e, pub.exponent, sizeof(pub.exponent));
memset(&priv, 0, sizeof(priv));
priv.bits = nbits;
bn_to_bin(rp->n, priv.modulus, sizeof(priv.modulus));
bn_to_bin(rp->e, priv.publicExponent, sizeof(priv.publicExponent));
bn_to_bin(rp->d, priv.exponent, sizeof(priv.exponent));
bn_to_bin(rp->p, priv.prime[0], sizeof(priv.prime[0]));
bn_to_bin(rp->q, priv.prime[1], sizeof(priv.prime[1]));
bn_to_bin(rp->dmp1, priv.primeExponent[0], sizeof(priv.primeExponent[0]));
bn_to_bin(rp->dmq1, priv.primeExponent[1], sizeof(priv.primeExponent[1]));
bn_to_bin(rp->iqmp, priv.coefficient, sizeof(priv.coefficient));
}
- 调用OPENSSL读取PEM文件的灵异问题
- OpenSSL中读取PEM文件的问题
- openssl pem文件的读取
- ZZ:OpenSSL中产生RSA KEY以及读取PEM文件的问题
- java读取OPENSSL生成的DSA的pem文件
- java读取OPENSSL生成的DSA的pem文件
- .NET使用OpenSSL生成的pem密钥文件
- .NET使用OpenSSL生成的pem密钥文件
- 使用OpenSSL生成证书,Pem文件生成
- 【加密与解密】C#如何读取pem的KEY文件
- Go语言无法读取需要密码访问的PEM文件问题(failed to parse private key)
- Go语言无法读取需要密码访问的PEM文件问题(failed to parse private key)
- Java Keystore 与Openssl Pem 的转换
- .NET使用OpenSSL生成的pem密钥文件(增加size为2048的密钥转换)
- OPENSSL中RSA私钥文件(PEM格式)解析
- OPENSSL中RSA私钥文件(PEM格式)解析
- OPENSSL中RSA私钥文件(PEM格式)解析
- openssl pem密钥文件rsa加密解密例子
- Html之table_rowspan用法_colspan_实例
- sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory
- iOS面试题
- 给你的移动网站加点料:推荐下载App,如果本地安装则直接打开本地App(Android/IOS)
- 从零开始学WCF(7)消息协定
- 调用OPENSSL读取PEM文件的灵异问题
- [Java]读取文件方法大全
- 又开始安卓的开发了.恼火,停了等一段时间好多都淡忘了.以后记下来,不再重蹈覆辙
- java中线程的基本操作!
- 《Oracle Applications DBA 基础》 1-2 系统概要及安装
- 【PSU升级】Oracle_RAC10.2.0.1到10.2.0.5.9的详细升级过程(三)
- iOS - 国际化(多语言):
- NSDateFormatter显示格式总结
- Eclipse快捷键大全