RSA 署名を検証したい。検証するデータ、署名、およびモジュラスと指数の形式の公開鍵があります。openssl を使用して検証を行いたいと思います。出来ますか?使用できることはopenssl rsautl -verify -in sig -inkey key.pem
わかっていますが、(opensslを使用して)モジュラスと指数だけを持つ公開鍵を作成する方法がわかりません。
たぶん、この署名をチェックする方法の他のアイデア(いくつかのプログラムを書くことを除いて)?
で使用する PEM 形式の RSA 公開キーを生成するにはopenssl
、次の手順に従います。
ASN1 定義ファイルを作成する
次のテンプレートを変更して、モジュラスと指数を含めます
# Start with a SEQUENCE
asn1=SEQUENCE:pubkeyinfo
# pubkeyinfo contains an algorithm identifier and the public key wrapped
# in a BIT STRING
[pubkeyinfo]
algorithm=SEQUENCE:rsa_alg
pubkey=BITWRAP,SEQUENCE:rsapubkey
# algorithm ID for RSA is just an OID and a NULL
[rsa_alg]
algorithm=OID:rsaEncryption
parameter=NULL
# Actual public key: modulus and exponent
[rsapubkey]
n=INTEGER:0x%%MODULUS%%
e=INTEGER:0x%%EXPONENT%%
編集する代わりに、sed を使用してこれをスクリプト化することもできます。
sed -i "s/%%MODULUS%%/$(xxd -ps -c 256 mymodulus.bin)/" def.asn1
-c 256
キーの長さ (バイト単位) に従って選択する必要があることに注意してください。
指数にも同様のコマンドを使用できます。
RSA キーを生成する
次の openssl コマンドを使用します。これにより、DER でエンコードされた RSA キーが得られます。
openssl asn1parse -genconf def.asn1 -out pubkey.der -noout
次に、それをPEMキーに変換します
openssl rsa -in pubkey.der -inform der -pubin -out pubkey.pem
キーを使用して確認する
またはのいずれopenssl dgst -verify
かを使用できますopenssl rsautl -verify
マニュアルページを確認すると、以下が表示されます
# generate private key
openssl genrsa > key.priv
# use it to sign something
echo "Dirk should be given $10" | openssl rsautl -inkey key.priv -sign > msg.sig
# create a pub key (modules, exp) from the private key
openssl rsa -pubout < key.priv > key.pub
# use that to verify the signature.
openssl rsautl -in msg.sig -verify -inkey key.pub -pubin
これはすべて、生のキーが必要であると仮定しています。右下のコメントを理解すると、通常の形式のモジュール/ exp がないようです。したがって、通常のツールで使用するには、最初に ASN.1 でパッケージ化する必要があります。
これには c/java/etc コードを書く必要があります。これを行う簡単な方法は、openssl ライブラリを使用することです。RSA * 構造に記入します。