それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

openssl rsa コマンドで 秘密鍵の詳細情報について調べてみる。

PEMの秘密鍵について調べてみた。

詳しくは、ここに書いてるので、実際にヤってみた結果などを。

d.hatena.ne.jp

秘密鍵の生成

今回は、パパっとパパっと使い方と使われ方を憶えるために、非常に小さな秘密鍵を使った

takuya@:~/Desktop$ openssl genrsa 128 > id_rsa.128bit.pem
Generating RSA private key, 128 bit long modulus
..+++++++++++++++++++++++++++
.+++++++++++++++++++++++++++
e is 65537 (0x10001)

できあがったものがこちら 

takuya@:~/Desktop$ cat id_rsa.128bit.pem
-----BEGIN RSA PRIVATE KEY-----
MGMCAQACEQC3mGbGKarEIV6qpC0+HU9HAgMBAAECEQCnNE71TmFNeKIH6LYr3+Lx
AgkA7gecG3zBveUCCQDFdL1/nTeluwIITMbRmKAmEe0CCHvB85OsglhJAgkAge95
CAPilGc=
-----END RSA PRIVATE KEY-----

この捨て鍵をベースに調べていく

秘密鍵に含まれる素数を取り出す。

takuya@:~/Desktop$ openssl rsa -text <  id_rsa.128bit.pem
Private-Key: (128 bit)
modulus:
    00:b7:98:66:c6:29:aa:c4:21:5e:aa:a4:2d:3e:1d:
    4f:47
publicExponent: 65537 (0x10001)
privateExponent:
    00:a7:34:4e:f5:4e:61:4d:78:a2:07:e8:b6:2b:df:
    e2:f1
prime1: 17151849347734945253 (0xee079c1b7cc1bde5)
prime2: 14228205478566405563 (0xc574bd7f9d37a5bb)
exponent1: 5532339645723316717 (0x4cc6d198a02611ed)
exponent2: 8917676552750258249 (0x7bc1f393ac825849)
coefficient: 9362835225658430567 (0x81ef790803e29467)
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MGMCAQACEQC3mGbGKarEIV6qpC0+HU9HAgMBAAECEQCnNE71TmFNeKIH6LYr3+Lx
AgkA7gecG3zBveUCCQDFdL1/nTeluwIITMbRmKAmEe0CCHvB85OsglhJAgkAge95
CAPilGc=
-----END RSA PRIVATE KEY-----

わーいいっぱい出てきた

  • modulus
  • publicExponent
  • privateExponent
  • prime1
  • prime2
  • exponent1
  • exponent2
  • coefficient

prime1/2 が「有名な」例の素数である。

秘密鍵から公開鍵を作る

openssl rsa -pubout < id_rsa.128bit.pem  > id_rsa.128bit.pem.pub

秘密鍵から、公開鍵を作成する。楽チン

公開鍵の情報も見てみる

 openssl rsa -text -pubin  <  id_rsa.128bit.pem.pub
Modulus (128 bit):
    00:b7:98:66:c6:29:aa:c4:21:5e:aa:a4:2d:3e:1d:
    4f:47
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRALeYZsYpqsQhXqqkLT4dT0cCAwEAAQ==
-----END PUBLIC KEY-----

わーいなにか出てきた

  • modulus
  • exponent

modulus (公開鍵・秘密鍵に含まれる)

これは、2つの素数の積である。prime1/prime2 から導出される。数字(素数の積)から素数を推定が難しいよねっていうアレである。

元の素数が推定できないからこそ、modulus は公開鍵に含まれている。

導出方法

参考サイトによると、exponent が暗号化の肝である

見た通り、RSA公開鍵は2つの素数の積(Modulus)とpublicExponentの2つである。

一方、秘密鍵は2つの素数がキモという話をしてきたけど、RSAの実装としては実は[2つの素数秘密鍵]では無い。暗号・復号の都合上、実際の秘密鍵はprivateExponentである。

RSAでは、以下のように鍵を生成する。WikipediaRSA暗号の項目の引き写しになるけど:

  • 2つの素数をp,qとする。これはopensslではprime1,prime2である。
  • 素数の積pqをnとする。これはopensslではmodulusである。
  • φ(n)=(p-1)(q-1)とする。
  • eを、φ(n)と互いに素な数から適当に選ぶ。これはopensslではpublicExponentである。eは候補がいくつもあるが、実装上はe=65537で決め打ちのようである。なぜこの値かと言うと、65537は2進数で書くと10000000000000001となり、ビットがほとんど立っていない。暗号化する際はe乗するので、なるたけビットが立っていない方が高速に計算できるからである。
  • dを、eとの積がφ(n)を法としたとき1となるよう選ぶ。つまり d * e ≡ 1 (mod φ(n))。これはopensslではprivateExponentである。

参考資料

opensslでRSA暗号と遊ぶ - ろば電子が詰まっている