
■ OpenSSLのd2i_RSAPublicKey関数の戻り値がNULLの件
<環境>
WindowsXP
OpenSSLバージョン1.0.0a
VC2005
<現象>
OpenSSLのライブラリ関数 d2i_RSAPublicKey関数を使用して、RSA構造体に公開鍵要素を取得
したいのですが、NULLが返ってきてしまいます。(入力は、公開鍵)
ERR_error_string(ERR_get_error(), NULL); 関数でエラーを確認したところ、
『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
と表示されます。
以下に、手順を追って、実行したことを書きます。
何が悪いのか、ご指摘いただきたいです。
(PEM形式は使用しない前提です。)
[鍵ペア生成(DER方式)]
まず、DOS窓を立ち上げて、下記のようにDERフォーマットの
RSA鍵ペアを作成しました。
openssl genrsa -out pri_test.der 2048
openssl rsa -in pri_test.pem -outform DER -out pri_test.der
openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der
秘密鍵:pri_test.der
公開鍵:pub_test.der
[公開鍵の読み込み と d2i_RSAPublicKey関数のコール]
公開鍵:pub_test.der を、VCの入力ファイルに入力し、
d2i_RSAPublicKey関数をコールしました。
// file read
/* 入力ファイルを開く */
FILE* file_p;
RSA* rsa;
unsigned char buff[1024];
unsigned char* pbuff;
file_p = "pub_test.der", "rb");
if( NULL == pF_pubca ) {
return -1;
}
// fileサイズを調べます(省略します)
filesize = 0x126;
// fileをバッファへ読み込みます
memset( buff, 0, sizeof(buff) );
fread( buff, 1, filesize, file_p );
// buff には公開鍵pub_test.derの値 と サイズ分、
// 全て正常に格納されている事を確認済みです
// ダブルポインタを作るために、ポインタバッファに渡します。
pBuff = pubca_buff;
// d2i_RSAPublicKey関数をコールし、RSA構造体に公開鍵要素を取得します。
rsa = d2i_RSAPublicKey( NULL, &pBuff, filesize );
// ↑ここで、rsa構造体にはNULLが格納されています。
// エラーのログを出力します。
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
// ⇒ 『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
// と表示されてしまいます。
<備考>
同様の方法で、入力を秘密鍵に設定し、d2i_RSAPrivateKey関数であれば、
正常にRSA構造体に各要素が格納されます。
何か、公開鍵をRSA構造体に格納するために、別の方法があるのでしょうか。
No.2ベストアンサー
- 回答日時:
正しいのかどうか…に関しては不明ですが……
>openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der
で公開鍵を作成する特に、「-pubout」ではなく「-RSAPublicKey_out」として出力したpub_test.derならば、d2i_RSAPublicKey()は通るようです。
……そんなオプション知らねぇよ…って感じですが、opensslのソースから検索するとあったりします。
-puboutだと「i2d_RSA_PUBKEY_bio()」で出力、-RSAPublicKey_outだと「i2d_RSAPublicKey_bio()」で出力…となっています。
……d2i_RSA_PUBKEY()だったら通るのではないでしょうか??
この回答への補足
ご回答ありがとうございます。
そもそも、d2i_RSA_PUBKEY関数の存在すら知りませんでした。
まずは、d2i_RSA_PUBKEY関数を使用してみます。
それで無理であれば、「-RSAPublicKey_out」オプション(初めて見ました...)
で作成してみて、d2i_RSAPublicKey関数を使用して読み込んで見ます。
ありがとうございます。
無事に読込むことができました。
ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを
使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
公開鍵要素を表示させようとしても、表示できませんでした。
------------エラーログ---------------
>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout
unable to load Public Key
23916:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:.\crypto\a
sn1\tasn_dec.c:1319:
23916:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:.
\crypto\asn1\tasn_dec.c:381:Type=X509_ALGOR
23916:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1
error:.\crypto\asn1\tasn_dec.c:751:Field=algor, Type=X509_PUBKEY
------------エラーログ---------------
但し、d2i_RSAPublicKey関数で読み込むと、正しい値が読込まれています。
# ここで正しい値とは、
# 「-pubout」で出力した公開鍵を、上記のOpenSSLコマンドを使って表示させた値と、
# 同じ値を取得できているという意味です。
奥が深すぎです...。
私のほうで「-RSAPublicKey_out」オプションを付けたりして、
どうにかコマンドで出力させようとしてみたのですが、全く出来ませんでした。
もし、何か方法があるのであればご教授頂きたいです^^;
No.3
- 回答日時:
>ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを
>使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
>公開鍵要素を表示させようとしても、表示できませんでした。
>>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout
openssl rsa -inform DER -RSAPublicKey_in -in temp_pub.der -text -noout
でどうでしょう?
# opensslのソース、apps\rsa.c内で判定しています。
出来ました!
-pubin と -RSAPublicKey は混在できないんですね。
Wr5さんのように、私もソースコードから解析するようにします。
このたび、誠にありがとうございました。
No.1
- 回答日時:
回答には結びつきませんが……
>file_p = "pub_test.der", "rb");
>if( NULL == pF_pubca ) {
突然出てくる「pF_pubca」はなにものですか?
# 直前のfile_pのエラーチェックではないのですか?
>filesize = 0x126;
同じく、突然出てくるこの変数はなにものですか?
# long型の変数…でしょうかね……。
>pBuff = pubca_buff;
同じく、この2つはなにものですか?
pbuff = buff;
なんじゃないですか?
コピペミスると検証も厳しくなるので注意した方がよろしいかと。
この回答への補足
全てご指摘のとおりです。
書き直そうとしたのですが、投稿後、修正できませんでした。
「質問者は回答できません」と出てきてしまいました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- UNIX・Linux Ubuntu20.04からUbuntu22.04にバージョンアップする際にssh-rsaが無効になっ 1 2022/11/25 00:08
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(形式科学) RSA暗号について 1 2022/06/01 00:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
switch分が機能しません。
-
system.out.printが出力されない
-
getName()で取得したファイル名...
-
StringBufferで改ページ処理を...
-
JavaScriptでcgiの戻り値を受け...
-
Log4jで機能毎に別ファイルへ出...
-
一定のスペースを空けて端を揃...
-
javacのエラー出力をテキストフ...
-
問は解けたのですが、疑問が残...
-
System.out.printlnの出力先
-
Eclipseのコンソールを常に表示...
-
ArrayList内HashMapの取得
-
数字文字列をパック10進数に変...
-
1~100までの数字を表示したい
-
JSONでの日本語を出力する際の...
-
log4jのログ出力先について
-
JavaのSystem.setOut、System.s...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
1~100までの数字を表示したい
-
System.out.printlnの出力先
-
一定のスペースを空けて端を揃...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
Tomcatが無応答となる現象が起...
-
行列の表示
-
InputStreamはreadが1回しかで...
-
数字文字列をパック10進数に変...
-
switch分が機能しません。
-
System.out.printlnの意味がよ...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
テキストエリアで改行する
-
【SQLServer接続のJSPの記述を...
-
CSVファイルへ出力
おすすめ情報