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」の略称ですね。

中国の剰余定理 – Wikipedia

じゃこれはどう使われるの?というと 「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を参考にさせて頂きました。まずはこのレベルの数学をちゃんと理解したいですね。

http://www.u-gakugei.ac.jp/~takalab/informathz.pd