公開鍵技術の検証:鍵の生成と電子署名・暗号化


ひとまずopensslコマンドだけで一通り公開鍵技術を試すメモ。
公開鍵技術は暗号処理と電子署名に使うことが多い。まずはこの2つの違いを理解することが重要。
一般論として

  • 暗号処理の場合、公開鍵で暗号化し、秘密鍵で複合する
  • 電子署名の場合は秘密鍵で署名し、公開鍵で検証する(RSAは対称性があるため逆も可能:ただコマンドは違うみたい)

となる。理にかなってる。単純だが、思いついた人(RSAの皆さん)すごい。

□鍵の生成

まず、何は無くても秘密鍵を生成。これは人に教えたり、盗まれてはいけない。

秘密鍵生成

生成。2021年現在、標準ではrsa 2048bitで生成されるみたい。

openssl genrsa > ./private_key.pem

公開鍵生成

秘密鍵から公開鍵を生成する。これは人に教えたり、提供したりするものです。

openssl rsa -in ./private_key.pem -pubout > ./public_key.pem

□電子署名

個人的には電子署名に公開鍵技術を利用することの方が多いのでまずは署名から。

署名する(署名の対象となる)ファイルの生成

echo "test" > ./test.txt

(秘密鍵で)署名する(署名の生成)

署名を生成する。元のファイルがどうこうなるわけではなく、その情報をベースに署名ファイルが生成されるのがミソ。

openssl dgst -sha256 -sign ./private_key.pem ./test.txt | openssl base64 > ./test.sig

(公開鍵で)検証する

検証する人は「検証対象のファイル」、「署名ファイル」、「公開鍵」の3つが必要となります。

#前処理
openssl base64 -d -in ./test.sig > ./test.sha256
#検証
openssl dgst -sha256 -verify ./public_key.pem -signature ./test.sha256 ./test.txt

Verified OK

別件の個人的用途のためbase64 encode, decodeを挟んでます。すみません。

□暗号化(と複合)

暗号化

暗号化。

openssl rsautl -encrypt -pubin -inkey ./public_key.pem -in ./test.txt > ./test.encrypted

複合

複合。

openssl rsautl -decrypt -inkey ./private_key.pem -in test.encrypted
test

その他

関連?のメモ。

ハッシュ出力

ハッシュの出し方メモ。

echo "test" | openssl sha256

(stdin)= f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2

base64

encode

echo -n "hogehoge" | base64

aG9nZWhvZ2U=

-nは、改行を出力しないオプション。普通はいらない?{}のときだけ?

decode

echo -n "aG9nZWhvZ2U=" | base64 -d