公開鍵暗号を利用して離れている相手とデータをやり取りするために使うコマンドをまとめてみる。
共通鍵暗号AESを利用してファイルを暗号化してみる。
$ ls -l # 暗号化するファイルと、パスワードを書き込んだテキストファイル
total 128
-rw-r--r-- 1 glire glire 123592 Feb 22 10:52 data0
-rw-r--r-- 1 glire glire 16 Feb 22 10:56 passwd.txt
$ openssl aes-256-cbc -e -in data0 -out data1 -pass file:./passwd.txt # 暗号化
$ openssl aes-256-cbc -d -in data1 -out data2 -pass file:./passwd.txt # 復号化
$ openssl aes-256-cbc -d -in data1 -out data3 # パスワードを標準入力から入力して復号化
enter aes-256-cbc decryption password:
$ ls -l data?
-rw-r--r-- 1 glire glire 123592 Feb 22 10:52 data0
-rw-r--r-- 1 glire glire 123616 Feb 22 10:57 data1
-rw-r--r-- 1 glire glire 123592 Feb 22 10:59 data2
-rw-r--r-- 1 glire glire 123592 Feb 22 11:03 data3
$ file data0
data0: Hierarchical Data Format (version 5) data
$ file data1
data1: data
$ cmp data0 data2
$ cmp data2 data3
$ cmp data0 data1
data0 data1 differ: char 1, line 1
公開鍵暗号RSAの秘密鍵を作ってみる。
$ openssl version
OpenSSL 1.0.2l 25 May 2017
$ openssl genrsa > private.pem # 2048ビット長の鍵が作られる
Generating RSA private key, 2048 bit long modulus
...................................................+++
......................................................+++
e is 65537 (0x10001)
$ openssl genrsa 64 > private_64.pem # 64ビット長の鍵
$ openssl genrsa 4096 > private_4096.pem # 4096ビット長の鍵
$ ls -l private*.pem
-rw-r--r-- 1 glire glire 1679 Feb 23 10:15 private.pem
-rw-r--r-- 1 glire glire 3247 Feb 23 10:16 private_4096.pem
-rw-r--r-- 1 glire glire 152 Feb 23 10:15 private_64.pem
$ cat private_64.pem # PEM形式(Base64)の秘密鍵を確認
-----BEGIN RSA PRIVATE KEY-----
MEACAQACCQDO8hGHwOBWvQIDAQABAgkAtRzNkTkIYIECBQD79VYFAgUA0kPjWQIE
HY9+JQIFAMAjVykCBQDZbh2D
-----END RSA PRIVATE KEY-----
公開鍵暗号RSAの秘密鍵から公開鍵を作ってみる。
$ openssl rsa -in private.pem -pubout -out public.pem # 秘密鍵から公開鍵を作成
writing RSA key
$ ls -l private.pem public.pem # ファイルサイズが4倍程度異なる
-rw-r--r-- 1 glire glire 1679 Feb 23 10:15 private.pem
-rw-r--r-- 1 glire glire 451 Feb 24 18:52 public.pem
$ cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr+aep4xfP4rmNkOKPm1i
okFA7T7TixCJm203JTK5gaJTSQpXyDi2NtSRQx72wj+uKO1gp/WhB5csNZPYfO1P
u4spxboCeT4+Z9BVd122ldfF7YER6i0NGbHuIzt7/WNCvgtd6XCAh2ONdjrahRqu
yDUGlzRfOf2vKsqgjzQimVysleSnlFIjBGH/YlvbYekWEi7zFOkBqeuEvr+F/glx
/oU8LL9B1HHgkfd2RIbM3GFxKwYtiQ1Afvrnqc4PLnDWqcsXupQZHa0HgQiNs+AR
eYknVWnOH8HHSHD5sPfDdD7sEYsPc5AGm0vJhgIEfY9vsIObgeLm+a1tg5zoTH+3
lQIDAQAB
-----END PUBLIC KEY-----
コマンドssh-keygenで作成した秘密鍵から公開鍵を作ってみる。
$ ssh-keygen
$ ls -l ~/.ssh/id_rsa*
-rw------- 1 glire glire 1679 Feb 24 22:18 /home/glire/.ssh/id_rsa
-rw-r--r-- 1 glire glire 410 Feb 24 22:18 /home/glire/.ssh/id_rsa.pub
$ openssl rsa -in ~/.ssh/id_rsa -pubout -out /tmp/public.pem
writing RSA key
$ ls -l /tmp/public.pem
-rw-r--r-- 1 glire glire 451 Feb 24 22:19 /tmp/public.pem
公開鍵暗号を利用して共通鍵を暗号化し、それを利用して大きなデータの暗号化と復号化を試してみる。
$ ls -l data4 passwd.txt private.pem public.pem
-rw-r--r-- 1 glire glire 248138 Feb 25 13:41 data4
-rw-r--r-- 1 glire glire 64 Feb 25 13:42 passwd.txt
-rw-r--r-- 1 glire glire 1679 Feb 23 10:15 private.pem
-rw-r--r-- 1 glire glire 451 Feb 24 18:52 public.pem
$ openssl rsautl -encrypt -pubin -inkey public.pem -in data4 -out data5 # 公開鍵で大きなデータを暗号化するとエラー
RSA operation error
140634066294464:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:153:
$ openssl aes-256-cbc -e -in data4 -out data5 -pass file:./passwd.txt # 大きなデータを共通鍵で暗号化
$ openssl rsautl -encrypt -pubin -inkey public.pem -in passwd.txt -out passwd.encrypted # 公開鍵で共通鍵を暗号化
$ openssl rsautl -decrypt -inkey private.pem -in passwd.encrypted -out passwd.decrypted # 秘密鍵で共通鍵を復号化
$ cmp passwd.txt passwd.decrypted # 共通鍵の復号化を確認
$ openssl aes-256-cbc -d -in data5 -out data6 -pass file:./passwd.decrypted # 暗号化されたデータを復号化された共通鍵で復号化
$ cmp data4 data6 # データの復号化を確認
$ ls -l data?
-rw-r--r-- 1 glire glire 248138 Feb 25 13:41 data4
-rw-r--r-- 1 glire glire 248160 Feb 25 13:53 data5
-rw-r--r-- 1 glire glire 248138 Feb 25 13:54 data6
以上を踏まえ、公開鍵暗号を利用して、自分のデータを暗号化して相手に送る手順。
- 共通鍵を作成し、自分のデータをその共通鍵で暗号化する。
- 相手から公開鍵を送ってもらい、共通鍵をその公開鍵で暗号化する。
- これら暗号化された2つのデータを相手に送る。
- 相手は秘密鍵で共通鍵を復号化する。
- データを復号化された共通鍵で復号化する。
以上を踏まえ、公開鍵暗号を利用して、相手から暗号化されたデータを受け取る手順。
- 相手に共通鍵を作成してもらい、データをその共通鍵で暗号化してもらう。
- 公開鍵を作成して相手に送り、共通鍵を暗号化してもらう。
- これら暗号化された2つのデータを相手から送ってもらう。
- 秘密鍵で共通鍵を復号化する。
- データを復号化された共通鍵で復号化する。