HN 日本語サマリー

← 一覧へ戻る
セキュリティ

90年代の認証局(CA)のRSA鍵をファクタリングした

I've factored the RSA keys of a Certificate Authority from the 90s (mcpherrin.ca)

457 pointsby ahlCVA104 コメント

要約

著者は、現代のデスクトップコンピュータで、1990年代に発行された認証局(CA)のRSA鍵をファクタリングすることに成功しました。具体的には、Netscape 4.51にバンドルされていたカナダのE-Certify社の512ビットRSA鍵を、それぞれ約30時間かけて分解し、秘密鍵を再構築しました。これらの鍵は当時すでに脆弱と見なされていましたが、現代では容易に破れることを示しています。

全文翻訳

90年代の認証局のRSA鍵を分解しました...

2026-09-07

… 90年代のものです。

最近、RSAのセキュリティについて考えていました。RSAの暗号化は、大きな半素数を素因数分解することの困難さに依存していますが、「大きい」とはどういう意味でしょうか。Web PKIは10年以上前に1024ビットRSAを非推奨にしましたが、そのサイズの鍵を分解する人がいるとは知りませんが、政府や多数のコンピュータを持つ他の組織にとっては可能性の範囲内です。ほんの数日前、RSA素因数分解チャレンジの862ビットRSA-260鍵が分解されました。これは私が知る限り最大の素因数分解です。今日、世界では少なくとも2048ビットのRSAが使用されていますが、将来の量子コンピュータのリスクを考えると、それさえもすぐに非推奨になるでしょう。

これが、小さなRSA鍵ならまともなデスクトップコンピュータでも素因数分解できるのではないか、という疑問につながりました。そして、Web PKIの初期には標準がなく、最小要件もありませんでした。Netscapeは1994年にSSLサポートをリリースし、IEもその直後にリリースしました。これはまだ暗号化に対する輸出規制の時代でした。私が分解できるほど小さな鍵は存在するのでしょうか?それを実行する良い理由はありませんが、楽しそうだと思いました。

もちろん、答えは「はい」ですが、まず cracking する鍵を見つける必要があります。

幸いなことに、ルート証明書はブラウザインストーラにバンドルされており、Internet ExplorerとNetscapeの両方のアーカイブがarchive.orgにあります。アーカイブは網羅的ではありませんが、古いルートCAを十分にカバーしているはずです。私は両方のコレクションをダウンロードし、Claude Codeにすべての古いルートを抽出させました。LLMが出力したこのウェブページを完全に信頼できるか検証していませんが、かなりもっともらしいように見えます。

そのサイトのフィルターを使用して、SSL用に信頼されている小さな鍵を見つけることができます。

[画像: 512ビットRSAルートにフィルタリングされ、SSL用に信頼されている古いルートのテーブル。Netscape 4.51に出荷されたE-Certify RSA 512 Goldルートが表示されている]

ありました!ターゲットです。1999年3月、Netscape 4.51は、SSL用に信頼されている512ビットRSA証明書局と、S/MIME用の証明書局を出荷しました。これらの2つのルートは、どちらもE-Certifyという、とっくに廃業したカナダの認証局のものでした。

その年の後半、512ビットのRSA-155が素因数分解されたので、当時の時代でもこれは弱すぎ、おそらく最初から出荷されるべきではなかったでしょう。

E-Certifyの512ビットルートは2002年にNetscapeによって削除されました。残念ながら、Internet ExplorerはSSL用の512ビットルートを出荷したことがないようなので、私たちの楽しみは比較的短い期間のNetscapeに限られます。

ルート証明書の公開鍵を素因数分解することで、秘密鍵を再構築するために必要な2つの素数を得ることができます。私はRyzen 9 5950XデスクトップでCADO-NFSを実行しました。E-Certify RSA 512 Gold Server(SSL用)の素因数分解に32時間、E-Certify RSA 512 Gold Client(S/MIME用)の素因数分解にさらに29時間かかりました。結果の秘密鍵は以下から取得できます。

CADO-NFSを指示に従ってインストールしたら、実行は簡単です。証明書から素因数分解するモジュラスを取得する必要があります。これはPythonで少し行うことができます。

from cryptography import x509
f = open("gold-server.pem", "rb").read()
pubkey = x509.load_pem_x509_certificate(f).public_key()
print(pubkey.public_numbers().n)

結果のNの値がCADO-NFSに渡す値です。例えば、

./cado-nfs.py $N -t 32 --workdir /data/cert1

E-Certifyルートが2003-10-16に期限切れになる前に時計を設定したNetscape 4.51を何らかの方法で実行していると仮定すると、これらの秘密鍵を使用して証明書を発行できます。これは地球上の誰も説明しません…このために設定したVMを除いて。

発行された証明書がNetscape 4.51で機能するかどうかを確認すること自体が冒険でした。Netscape 4.51と最新のTLSスタックの間にはTLS機能の重複が全くないからです。そこで、再びClaude Codeを使ってGoでカスタムの古いTLSサーバーを作成しました。このサイトはe-certify.fly.devで公開ホストされています。Netscapeのコピーをお持ちの方は自由に試すことができますが、最新のブラウザでは読み込めません。

[画像: E-Certify RSA 512 Gold Serverによって発行されたe-certify.fly.devの証明書を示すNetscape 4.51証明書ビューア]

あるいは、これらの古い鍵を使って独自のウェブサイトをホストしたい場合は、鍵とツールはすべてhttps://github.com/mcpherrinm/ancientrootsのリポジトリにあります。あるいは、もっと悪いことをして、25年前に時計を設定したすべてのNetscape 4.51ユーザーのSSLをMitMするなど…

C=CA, O=E-Certify, OU=RSA Gold Server, CN=E-Certify RSA 512 Gold Server
-----BEGIN CERTIFICATE-----
MIIByjCCAXSgAwIBAgIBATANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES
MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBTZXJ2ZXIxJjAk
BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgU2VydmVyMB4XDTk4MTAxNjEz
MzM3NTNaXDTAzMTAxNjEzMzc1M1owYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt
Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgU2VydmVyMSYwJAYDVQQDEx1FLUNl
cnRpZnkgUlNBIDUxMiBHb2xkIFNlcnZlcjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
QQDNVQ93Ev7zgNaJAR1Z7gCydU6mky1e/B4EbY1NsdtfsitU9cELqg5uRJDPA40n
CDPeOyil1lJ5N8hekcqJAkkXAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQEEBQADQQB09SV6OeeDEP8Je3DOLNZ24U98NHqIBTDyB4sRpDmNdHum
+3rm4AYtznBxG5hEShO89bcWi3yJtBITGuTRDnMq
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAM1VD3cS/vOA1okBHVnuALJ1TqaTLV78HgRtjU2x21+yK1T1wQuq
Dm5EkM8DjScIM947KKXWUnk3yF6RyokCSRcCAwEAAQJAWZ2FOWf+A9K4T2VAJS69
+SU/pW3YwHrysuYJZN56K0Iz+Hqd1hBhCeJ3/T+/cvXq+ctD0x3uOxU1rDSeCoMO
KQIhAPdbc1wTm3twWDYi1iXmRBXz97MYxRFld/KFr8x5+tK9AiEA1IG09a+oVg6j
NMDj6GD7spaD4q9t1wk/Nyq/MTLPkmMCIEzzYjvuzZvlI0wUIlLAA8Zgk1pgBk6X
Jm2IMVyHRgRxAiEAjZKgCTHuVu7HgiSjcTPzW0X1NTckWSc66zjaSR+Ns/sCICxT
yXoTXWQCWL6BMpf2no7IlvoEnBIrED2Frq3PxlEA
-----END RSA PRIVATE KEY-----
C=CA, O=E-Certify, OU=RSA Gold Client, CN=E-Certify RSA 512 Gold Client
-----BEGIN CERTIFICATE-----
MIIByjCCAXSgAwIBAgIBAjANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES
MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBDbGllbnQxJjAk
BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgQ2xpZW50MB4XDTk4MTAxNjEz
MzQwOFoXDTAzMTAxNjEzMzQwOFowYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt
Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgQ2xpZW50MSYwJAYDVQQDEx1FLUNl
cnRpZnkgUlNBIDUxMiBHb2xkIENsaWVudDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
QQBwCcT1iYlNyKPywB/kffD8esiCzGYJxSnTXQjU6ej/XxnA+9yqjzAMPtqFd094
wM89Vsmz9YOWSO6Qn6wOAs45AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQEEBQADQQAdktdM5AzW+0o96eHCHwD3UfzxPvjKxPEjiI/QTn+njHt/
BEJb9yZatONRckglVc9v8P8Dy8HZGQD0+Pn0uxhW
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJAcAnE9YmJTcij8sAf5H3w/HrIgsxmCcUp010I1Ono/18ZwPvcqo8w
DD7ahXdPeMDPPVbJs/WDlkjukJ+sDgLOOQIDAQABAkASXZeaxFPsm0I8zb+snfR9
/saVolnrqhVEH5EODdXy3nSm6fpdrsDwQDDg52biXjIUizQYdd3OourOn0/PyyiB
AiEAyW4gFFgM0dJ+Y//vrIyQutLeH/5c/Vq3Lbcxv7R908kCIQCOZAAv8OCG/2oH
yKaYj/EoxcFZ9csVh/kjicO/JIX+8QIhAMEzAkvhBDLALYAmvDCJBkxa8rhHFdPf
jbCodGwGZ2WZAiB//XmBnlZkYl/PoVfGmNRgHun+0AZ9UxzqCeJvBQiBMQIgHWlr
0Sh1a8K2pQP2ktgmL3RH5+1Qd2wLx/hhGWtwPvU=
-----END RSA PRIVATE KEY-----

ボーナスとして、Internet Explorer 3.02はOU=Test VeriSign Commercial Software Publisher CAというコードサイニングCAを出荷しました。それが何に使われるのかはよくわかりませんが、同様に簡単に素因数分解できます。ancient rootsリポジトリには、他にもテスト用の512ビットRSA鍵がいくつかあるので、さらにいくつか素因数分解したり、何に使用できるか調べてみてください!

Steve Weisはこの鍵をGPUクラスタを使って約1時間で素因数分解しました。

L=Internet, O=VeriSign, Inc., OU=Test VeriSign Commercial Software Publisher CA
-----BEGIN CERTIFICATE-----
MIIByDCCAXKgAwIBAgIQIsTi2AgEp+1OkpqVLROnazANBgkqhkiG9w0BAQQFADBl
MREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1
BgNVBAsTLlRlc3QgVmVyaVNpZ24gQ29tbWVyY2lhbCBTb2Z0d2FyZSBQdWJsaXNo
ZXIgQ0EwHhcNOTYwNTAyMTcwMTUyWhcNOTcwNTAyMTcwMTUyWjBlMREwDwYDVQQH
EwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLlRl
测试t3d2YXJlIFB1Ymxpc2hlciBDQTBcMA0GCSqGSIb3DQEBAQUAA0LADBIAkEA1Xq
Tpg1hQWq6IKvBXLor12GBTH6y4BHyOJjyMJISn0ZWBqkbZiEfoWgaWXhEwrvxMW
onLA2vYFHijofFG4YIjwIDAQABMA0GCSqGSIb3DQEBBAUAA0EAKxuR/KPJPDNJgw0O
RqqM7SlvIeqnVP71OEFytqPaZw/3TPEi9oK6PzBvPdLBZlnjRd/hf58FW2+/PXxs
Fl78Mg==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBANV6k6YNYUFquiCrwVy6K9dhgUx+suAR8jiY8jCSEp9GVgapG2Yh
H6FoGll4RMK78TFqJywNr2BR4o6HxRuGCI8CAwEAAQJAYM8tlegLarcToS1CiuKC
bzHwiNgMFkENL01sx0n21/MhmA6pBiSwVn3Pu6yvx6EMB1zbCsaBHs/VTyofMbRW
QQIhAOqdAX3bVZwAlZ5FDWyfGwgE0FXEIQ85kjcihrFeDs49AiEA6PBfC0YuNMSa
M135mH+MEY1GEmQe9xHcXpiYAPazCrsCIQDDtuw6oJEfDYHCwRn8xhGXs+RT18Q4
Xi9yXRP9vFgfhQIhAIYUTfD0XYZcIBIvJosj56D2u328iaJXcow0s1Hirp4fAiAG
bza0Qcc27d/0OzKOqep3JrDl/L5HidTj2XEqEXmnXw==
-----END RSA PRIVATE KEY-----

そして最後に、SSL Labsは私のテストサイトを素晴らしいと評価しています。

[画像: e-certify.fly.devのSSL Labsレポート。多くの問題があり、F評価となっている]