• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            調(diào)用OPENSSL讀取PEM文件的靈異問題

            Posted on 2010-01-11 18:30 S.l.e!ep.¢% 閱讀(6769) 評論(0)  編輯 收藏 引用 所屬分類: OpenSSL

            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,很不爽,將函數(shù)改一下 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)?
            ?

            ?

            對應(yīng)的很工整是不是,你生成一個私鑰,然后用它生成一個公鑰。

            openssl?genrsa?-out?private.pem?1024?
            openssl?rsa?-in?priv.pem?-pubout?-out?public.pem?

            用任何一種方法打開私鑰,讀取私鑰信息,得到RSA,查看RSA,ok,沒有問題,一切都還看起來比較正常。

            然后用任何一種方法打開公鑰,讀取公鑰信息,問題出現(xiàn)了:RSA對象為空,你失敗了。

            ?

            通過openssl的手冊和幫助,你會發(fā)現(xiàn)兩個函數(shù):

            PEM_read_bio_RSA_PUBKEY()
            PEM_read_RSA_PUBKEY()

            他們才是你要找的對應(yīng)的,而上面兩個函數(shù)是從任何.h里面找不到的,但是他們的確是真實存在的符號連接,在對應(yīng)的.o文件中用objdump可以查看到他們的符號,很詭異!

            現(xiàn)象描述完了,還未探其究竟。

            附加讀取 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);


            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));
            }
            91久久香蕉国产熟女线看| 久久精品国产亚洲AV无码麻豆| 久久影院综合精品| 99久久精品费精品国产一区二区| 青青草国产精品久久久久| 欧美伊人久久大香线蕉综合69| 久久午夜福利无码1000合集| 久久久久久亚洲AV无码专区| 精品综合久久久久久88小说| 亚洲女久久久噜噜噜熟女| 久久综合综合久久狠狠狠97色88| 精品久久久久久久国产潘金莲| 精品久久久久久国产潘金莲| 午夜精品久久久久久影视riav| 嫩草伊人久久精品少妇AV| 欧美久久久久久午夜精品| 国产一久久香蕉国产线看观看| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 97久久精品午夜一区二区| 亚洲成av人片不卡无码久久| 精品一区二区久久久久久久网站| 久久夜色精品国产噜噜亚洲a| 久久久91精品国产一区二区三区 | 乱亲女H秽乱长久久久| 久久久久久av无码免费看大片| 91精品国产综合久久久久久| 久久精品一区二区三区AV| 午夜精品久久久久成人| 久久国产成人精品国产成人亚洲| 久久精品国产99久久久| 日产精品99久久久久久| 久久久久av无码免费网| 欧美日韩久久中文字幕| 日韩人妻无码一区二区三区久久99| 国产农村妇女毛片精品久久| 岛国搬运www久久| 国产高潮久久免费观看| 久久噜噜久久久精品66| 亚洲国产成人久久综合一区77| 日日狠狠久久偷偷色综合免费 | 久久综合久久综合久久综合|