PEMの秘密鍵について調べてみた。
詳しくは、ここに書いてるので、実際にヤってみた結果などを。
秘密鍵の生成
今回は、パパっとパパっと使い方と使われ方を憶えるために、非常に小さな秘密鍵を使った
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では、以下のように鍵を生成する。WikipediaのRSA暗号の項目の引き写しになるけど:
- 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である。