Let’s Encrypt のサーバ証明書や秘密鍵をちょっとだけ深追い PKCS #1 秘密鍵編
前回の記事の続きです。
今回はopensslコマンドで実際のエンコード前の素のLet’s encryptで生成された秘密鍵のデータの中身を調べてみたいと思います。
基本は「PKCS #1」というRSA社(今はEMC社に買収、EMC社はDELLに買収)が以前に発表した標準?が世界標準になっているとのことみたいですね。大本の標準はEMC社にあるようですので、こちら行けることころまで見てみたいと思います。以下PKCS#1のEMC社上のPDFファイルです。でも難し過ぎてほとんどわかりません。。6,7,8ページ目くらいはなんとかわかりそうです。
https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf
https://tools.ietf.org/html/rfc8017
秘密鍵(privkey.pem)を見る
$ sudo openssl rsa -in /etc/letsencrypt/live/ドメイン名/privkey.pem -text -noout
上記のコマンドの実行結果は以下のようになります。16進数が続く部分は省略してあります。
言うまでもないのですが、秘密鍵は秘密にしておいてください!
Private-Key: (2048 bit)
modulus:
00:d0:34:e0:86:5c:30:16:57:a3:30:c7:d8:4a:78:
--16進数が続く-----
18:f3
publicExponent: 65537 (0x10001)
privateExponent:
74:29:4c:2b:2a:3b:d9:fb:43:1c:f0:22:88:4a:39:
--16進数が続く-----
81
prime1:
00:ff:88:5f:64:32:65:f9:d0:32:93:9a:d2:9d:c1:
--16進数が続く-----
a2:16:b5:35:72:6a:1a:c8:e3
prime2:
00:d0:96:59:46:c6:70:83:7f:16:21:5a:1c:ff:d7:
--16進数が続く-----
50:4e:51:9c:e9:96:41:3c:b1
exponent1:
00:d6:a2:ad:bd:73:b7:c4:45:e4:b5:a6:ee:12:24:
--16進数が続く-----
ca:dd:58:08:34:ba:7b:15:11
exponent2:
07:fc:49:8c:b1:1a:2b:9e:98:ed:4b:f2:e2:44:8e:
--16進数が続く-----
8c:f8:08:e6:d4:6e:c8:f1
coefficient:
0b:a9:f5:42:a7:25:16:80:48:a0:22:b4:37:fb:a1:
--16進数が続く-----
ce:93:38:2d:71:1f:9e:00
フォーマットは単純ですが、謎の16進数の変数が列挙されていますね。秘密鍵の実物というのは「RSA modulus」と「RSA private exponent」のペアのこととのことですので、上記の出力の「modulus:」(PDFでは「n」)と「privateExponent:」(PDFでは「d」)の部分が秘密鍵ペアということになりますね。
modulus = prime1 x prime2
の関係ですね。prime1とprime2が大事な素数のペアですね。PDFの中ではprime1 は「first factor」 または「p」、prime2は「second factor」または「q」 と呼ばれていますね。
publicExponentは65537 (0x10001) でどの秘密鍵でもpublicExponentはこの値です(2019年現在のRSA暗号ではと思います。)。「e」ですねPDFでは。ということで公開鍵のペアは「modulus:」と「publicExponent:」ということになります。「n」と「e」です。
まとめて
・秘密鍵は「modulus:」と「privateExponent:」の数値ペア。「n」と「d」。
・公開鍵は「modulus:」と「publicExponent:」の数値ペア。「n」と「e」。
以上です。
として終わりたいところですが、他にも謎の変数がありますので、行けるところまで理解してみたいと思います。以下の部分はかなり私の勝手な理解ですので、正しく無いことご理解ください。
exponent1やexponent2,coefficientは何のため?
「exponent1:」はPDFはの中でいうと「dP (first factor’s CRT exponent)」
「exponent2:」はPDFはの中でいうと「dQ (second factor’s CRT exponent)」
「coefficient:」はPDFはの中でいうと「dInv ((first) CRT coefficient)」
に当たるのはわかります。CRTというのは「Chinese Remainder Theorem」の略称ですね。
じゃこれはどう使われるの?というと 「5.Cryptographic primitives」のところの「5.1.2 RSADP」(たぶんRSA Decryption Protocol)セクションの部分にどうやって暗号メッセージを復号するかの基本的な数式が記載されてますね。ここで気づくのは秘密鍵を構成する個数によって2種類の復号方法があるということですね。
以下「m」は復号化されたメッセージ、「c」は暗号化されたメッセージです。
1.秘密鍵が(n,d)だけの時
let m = c^d mod n.
これはなんとなくわかりますね。RSA暗号の解説でよく見る式です。
2.秘密鍵が(p, q, dP, dQ, qInv)の時
すいませんがこちらはただのコピペです。数学的な意味は不明です。でもきっとパタン1と数学的には同等なんだと思います。
i. Let m_1 = c^dP mod p and m_2 = c^dQ mod q.
ii. If u > 2, let m_i = c^(d_i) mod r_i, i = 3, …, u.
iii. Let h = (m_1 – m_2) * qInv mod p.
iv. Let m = m_2 + q * h.
v. If u > 2, let R = r_1 and for i = 3 to u do
1. Let R = R * r_(i-1).
2. Let h = (m_i – m) * t_i mod r_i.
3. Let m = m + R * h.
速度処理を考えて2番めのパターンがあるんだと思いますが、これ以上理解するのはしばらく無理なので、一旦置いときます。。もうちょっと勉強して続き書いてみたいです。ただこれ以上の理解はIT土方としてなんとかやっと生活してきた私の限界ですかね。
以下のPDFを参考にさせて頂きました。まずはこのレベルの数学をちゃんと理解したいですね。