labunix's blog

labunixのラボUnix

LPIC303 Ver2.0、公開鍵の基礎の復習をしてみる。

■LPIC303 Ver2.0、公開鍵の基礎の復習をしてみる。

 KVM上にLPIC303 Ver2.0の学習環境を構築する。
 http://labunix.hateblo.jp/entry/20180715/1531661773

■以下から何が変わったのかを確認するには、公式サイトの情報と照らすのが早い。

 Wheezyのopensslでダイジェスト計算、ローカルCA認証局、自己署名証明書
 http://d.hatena.ne.jp/labunix/20130513

■試験範囲の情報からは読み取れないほど大きな変化は無い様子。
 5年前との違いは1024bitよりも2048bitが一般的になった程度だろうか。

$ w3m -cols 120 -dump http://www.lpi.or.jp/lpic3/range/range303.shtml | grep -A 18 "   *325.1 "
                                           325.1 X.509 証明書と公開鍵の基礎
    重要度     5
     説明      X.509 証明書と公開鍵の基礎について理解していることが求められる。OpenSSLを使用しての認証局を作成したり、
               さまざまな目的にSSL証明書の発行する方法も含まれる。
                 • X.509 証明書、X.509 証明書のライフサイクル、X.509 証明書のフィールドおよびX.509v3 証明書の拡張につい
                   ての理解。
                 • トラストチェーンと公開鍵の基礎についての理解。
主要な知識範囲   • 公開鍵と秘密鍵の生成と管理。
                 • セキュアな認証局の作成と運用。
                 • サーバー証明書とクライアント証明書の要求、署名、管理。
                 • 証明書と認証局の廃止。

                 • opensslとそのサブコマンド
重要なファイル   • OpenSSL の設定
      、         • PEM, DER, PKCS
用語、ユーティ   • CSR
    リティ       • CRL
                 • OCSP

■公開鍵暗号方式を使ったメッセージのやりとりを図示してみる。
 「(公開鍵の)提供」と「(暗号化メッセージの)送信」が、
 第三者に通信を傍受される可能性があるポイント。

# apt-file search bin/graph-easy
libgraph-easy-perl: /usr/bin/graph-easy

# apt-file search bin/dot | grep dot\$
graphviz: /usr/bin/dot

# apt-get install -y libgraph-easy-perl graphviz

$ echo "("受信者準備" [生成] --> [秘密鍵] --> [公開鍵]) \
        [公開鍵] --> [(公開鍵の)提供] --> [平文(送信)] \
        (送信者[平文(送信)] --> [暗号化]) \
        [暗号化] --> [(暗号化メッセージの)送信] --> [秘密鍵] \
        (受信者 [秘密鍵]--> [復号] --> [平文(受信)]" | graph-easy --dot | dot -T svg -o message_crypt.

f:id:labunix:20180716005139p:plainsvg

■秘密鍵の生成
 des3で暗号化したRSA形式の秘密鍵を、鍵長2048bitで生成

# openssl genrsa -out private.key -des3 2048
Generating RSA private key, 2048 bit long modulus
......................+++
......................................................................+++
e is 65537 (0x010001)
Enter pass phrase for private.key:
Verifying - Enter pass phrase for private.key:

# openssl rsa -in private.key -out private-nopass.key
Enter pass phrase for private.key:
writing RSA key

■秘密鍵の内容を確認

# openssl rsa -in private.key -text | grep "^[a-z].*\:"
Enter pass phrase for private.key:
writing RSA key
modulus:
publicExponent: 65537 (0x10001)
privateExponent:
prime1:
prime2:
exponent1:
exponent2:
coefficient:

■公開鍵の生成

# openssl rsa -in private.key -pubout -out public.key
Enter pass phrase for private.key:
writing RSA key

■公開鍵の内容を確認

# openssl rsa -pubin -in public.key -text | grep "^[A-z].*\:"
writing RSA key
Public-Key: (2048 bit)
Modulus:
Exponent: 65537 (0x10001)

■公開鍵の提供

# scp public.key labunix@172.31.31.32:~/
labunix@172.31.31.32s password: 
public.key                     100%  451   426.9KB/s   00:00

■平文(送信)を暗号化

# echo "Hello World" > Sample.txt; \
  openssl rsautl -encrypt -pubin -inkey public.key -in Sample.txt -out Sample.txt.enc

■暗号化されたッセージを送信

# scp Sample.txt.enc labunix@172.31.31.31:~/
labunix@172.31.31.31s password: 
Sample.txt.enc                 100%  256   222.9KB/s   00:00

■暗号化されたッセージを秘密鍵で復号

# openssl rsautl -decrypt -inkey private.key -in Sample.txt.enc -out Sample.txt
Enter pass phrase for private.key:

■平文(受信)の確認

# cat Sample.txt
Hello World

■あまりにも簡単に解けるので注意が必要という前置きをして。。。

# echo "229 227" | awk '{print $1*$2}'
51983

# factor 51983
51983: 227 229

# openssl prime 227
E3 (227) is prime

# openssl prime 229
E5 (229) is prime

■秘密鍵を暗号化せずに、公開鍵とのペアを生成する。
 メッセージの暗号化としては使えずにエラーとなるので、
 基本動作の確認のためだけに。

# openssl genrsa -out priv.key 16;echo "[16bitのRSA形式の秘密鍵を生成]"
Generating RSA private key, 16 bit long modulus
.+++++++++++++++++++++++++++
.+++++++++++++++++++++++++++
e is 65537 (0x010001)
[16bitのRSA形式の秘密鍵を生成]

# openssl rsa -in priv.key -pubout -out pub.key;echo "[秘密鍵から公開鍵を生成]"
writing RSA key
[秘密鍵から公開鍵を生成]

# openssl rsa -in priv.key -text
Private-Key: (16 bit)
modulus: 51983 (0xcb0f)
publicExponent: 65537 (0x10001)
privateExponent: 43241 (0xa8e9)
prime1: 229 (0xe5)
prime2: 227 (0xe3)
exponent1: 149 (0x95)
exponent2: 75 (0x4b)
coefficient: 114 (0x72)
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MCQCAQACAwDLDwIDAQABAgMAqOkCAgDlAgIA4wICAJUCAUsCAXI=
-----END RSA PRIVATE KEY-----

# openssl rsa -pubin -in pub.key -text
Public-Key: (16 bit)
Modulus: 51983 (0xcb0f)
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MB4wDQYJKoZIhvcNAQEBBQADDQAwCgIDAMsPAgMBAAE=
-----END PUBLIC KEY-----

# openssl rsautl -encrypt -pubin -inkey pub.key -in Sample.txt -out Sample.txt.enc
RSA operation error
140356568171776:error:04068065:rsa routines:rsa_ossl_public_encrypt:bad e value:../crypto/rsa/rsa_ossl.c:65: