公開鍵暗号方式

2023-05-06 (土) 10:25:25

公開鍵暗号方式とは

  • 鍵ペア
    • ペアとなる公開鍵(Public Key)と秘密鍵(Private Key)を使う。
    • 鍵は両者が持つ、データを暗号・復号する時に使用する鍵が異なる暗号化技術。
    • 片方の鍵は公開鍵として公開して、もう片方の鍵は秘密鍵として厳重に管理する。
  • 公開鍵(Public Key)の呼称は色々。
    • 非対称鍵(Asymmetric Key)
  • 特徴
    • 1つの鍵ペアで片方向の暗号化。
  • 暗号化・復号の処理速度
  • 必要な鍵の数
    • n人がやりとりをする為に必要な鍵の数
    • 2n

暗号化の方式(アルゴリズム)

  • RSA
  • ECC (楕円曲線暗号)
  • Elgamal
    • 位数が大きな群れの離散対数問題が困難であることを利用している。
  • Rabin
  • SECP

公開鍵暗号方式の用途

データ通信

  • 公開鍵で暗号化し、秘密鍵で復号する。
    • 公開鍵:暗号鍵
    • 秘密鍵:復号鍵
  • 秘密鍵は鍵ペアを作成した本人のみが保持し、公開鍵はデータを送付してもらいたい相手に渡す。
  • データの受け取り側以外は誰もデータを復号できない。
  • 暗号化する公開鍵は公開する前提なので、受け渡しは容易。
  • フロー
    1. 受け取り側:公開鍵と秘密鍵を、一緒に作成する。
    2. 受け取り側:公開鍵を送り側に渡す。
    3. 送り側:公開されている公開鍵でデータを暗号化する。
    4. 送り側:暗号化されたデータを受け取り側に送付する。
    5. 受け取り側:非公開の秘密鍵で復号する。

デジタル署名

  • 秘密鍵で暗号化(署名)し、公開鍵で復号(署名検証)することで、署名データが署名者によって生成されていることを検証する。
    • 秘密鍵:暗号鍵(署名鍵)
    • 公開鍵:復号鍵(検証鍵)
  • 署名データは、秘密鍵(署名鍵)を持っている署名者にしか生成することができないことを前提に成立する。
  • フロー
    1. 署名者:秘密鍵(署名鍵)と公開鍵(検証鍵)を、一緒に作成する。
    2. 署名者:公開鍵(検証鍵)を送り側に渡す。
    3. 署名者:データとハッシュ関数を使いハッシュ値を生成する。(ダイジェストの生成)
    4. 署名者:秘密鍵(署名鍵)とハッシュ値を使ってハッシュ値を暗号化する。(署名データの生成)
    5. 署名者:データと署名データ(暗号化したハッシュ値)を検証者に送信する。
    6. 検証者:公開鍵(検証鍵)で署名データ(暗号化したハッシュ値)を復号する。
    7. 検証者:データとハッシュ関数(署名者と同じ)を使いハッシュ値を生成する。(ダイジェストの生成)
    8. 検証者:復号したハッシュ値とデータから生成したハッシュ値が一致していることを確認する。

公開鍵認証

  • クライアント側で鍵ペアを生成し、公開鍵をサーバに登録することで、クライアントを認証できるようにするユーザ認証の方式
  • SSH

鍵のフォーマット

RFC 4716

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "<comment>"
<Base64-encoded-key>
---- END SSH2 PUBLIC KEY ----

PKCS #8

-----BEGIN PRIVATE KEY-----
<Base64-encoded-key>
-----END PRIVATE KEY-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
<Base64-encoded-key>
-----END ENCRYPTED PRIVATE KEY-----

PEM

-----BEGIN <Label>-----
<Base64-encoded-key>
-----END <Label>-----
  • Label
    • CERTIFICATE
    • X509 CRL
    • RSA PRIVATE KEY
    • RSA PUBLIC KEY

OpenSSH

  • 秘密鍵
    -----BEGIN OPENSSH PRIVATE KEY-----
    <Base64-encoded-key>
    -----END OPENSSH PRIVATE KEY-----
    • OpenSSH 7.8 からOpenSSH形式で作成されるようになった。その前はPEM形式。(ssh-keygen コマンド)
  • 公開鍵
    ssh-rsa <Base64-encoded-key> <username>@<hostname>

関連用語