研究者が、信頼されたSSL証明書の公開鍵内に、ジョークやテキストなどのバニティメッセージを直接隠すことが可能であることを実証しました。RSAモジュラス(n)を操作して特定のbase64エンコードされた文字を含めることで、ウェブサイトの所有者は、証明書機関(CA)によって署名されるのに十分な数学的機能性を維持しつつ、証明書の生データを検査する人に対して隠されたメッセージを表示する証明書を生成できます。

このスクリーンショットは、研究で議論されている公開鍵のトリックの技術的な実装を説明しています。
バニティ・モジュラスの仕組み
RSA暗号システムにおいて、公開鍵はモジュラス(n)と公開指数(e)で構成されます。モジュラスは2つの大きな素数、pとqの積です。モジュラスはユーザーが制御できるため、データのストレージ空間として扱うことができます。
メッセージを埋め込むために、研究者の手法では、まずランダムな素数(p)を選択し、そのbase64エンコード内に目的のメッセージを含むターゲット・モジュラス(n)を計算します。結果として得られる値はpとqの完全な積ではないため、研究者はターゲットnをpで割り、最も近い素数に丸めることで新しいqを計算します。

この画像は、バニティ・モジュラスを生成するために使用されるコードの具体的な例を提供します。
pとqはサイズが似ているため、qのわずかな変更は積の最下位ビットの半分にしか影響しません。これにより、メッセージがモジュラスの上半分に埋め込まれている場合、メッセージは損傷されず読み取れる状態に保たれます。
「結果として得られるqの値は、素数(または整数)である可能性は非常に低いため、それを丸めて理想的なqの次の素数を見つけます。これは通常、qの値を数百だけ変更するだけで済みます。」
— Horible public key tricks:
信頼される証明書の取得
バニティ・モジュラスが確立されると、研究者は得られたpとqを使用して機能的なRSA秘密鍵を構築します。この鍵は、証明書署名要求(CSR)を介して証明書機関に提出できます。

この画像は、機能を維持しながらモジュラスを修正する方法に関する技術的な説明を補完します。
研究者は、OpenSSLやACMEクライアント(Certbotなど)といった標準的なツールを使用して、これらの鍵に対して有効な証明書を取得できることを実証しました。証明書のレイアウトは静的なため、base64で正しく読み取れるようにメッセージの配置を調整することができます。
その結果、ウェブブラウザには完全に正常に見えるものの、証明書ビューアや`openssl s_client`のようなコマンドラインツールで表示すると隠された文字列が含まれている証明書が得られます。
セキュリティ上のトレードオフと制限
この技術は、意図的に秘密鍵のエントロピーを低下させます。研究者は、これが一種の圧縮であると指摘する一方で、素数pとqが近すぎる場合や、秘密指数(d)が小さくなりすぎる場合、理論的には鍵の素因数分解が容易になる可能性があると述べています。
しかし、公開ウェブサイトの場合、そのリスクは現代のTLSプロトコルによって緩和されます。現代のTLSは前方秘匿性を提供するため、長期的なRSA秘密鍵が侵害されても、攻撃者が過去のセッションを復号することはできず、中間者攻撃を容易にするだけです。
研究者は、現在の生成スクリプトではこれらの特定の不安全な値をチェックしていないことを認めていますが、「プロテスト証明書」は、標準的な証明書システムの複雑さについて主張を伝えつつ、トラフィックを暗号化する実行可能な方法であり続けると主張しています。