LoginSignup
5
4

More than 5 years have passed since last update.

ファイルの暗号化

Last updated at Posted at 2018-02-22

公開鍵暗号を利用して離れている相手とデータをやり取りするために使うコマンドをまとめてみる。

共通鍵暗号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

以上を踏まえ、公開鍵暗号を利用して、自分のデータを暗号化して相手に送る手順。

  1. 共通鍵を作成し、自分のデータをその共通鍵で暗号化する。
  2. 相手から公開鍵を送ってもらい、共通鍵をその公開鍵で暗号化する。
  3. これら暗号化された2つのデータを相手に送る。
  4. 相手は秘密鍵で共通鍵を復号化する。
  5. データを復号化された共通鍵で復号化する。

以上を踏まえ、公開鍵暗号を利用して、相手から暗号化されたデータを受け取る手順。

  1. 相手に共通鍵を作成してもらい、データをその共通鍵で暗号化してもらう。
  2. 公開鍵を作成して相手に送り、共通鍵を暗号化してもらう。
  3. これら暗号化された2つのデータを相手から送ってもらう。
  4. 秘密鍵で共通鍵を復号化する。
  5. データを復号化された共通鍵で復号化する。
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4