2013年1月19日土曜日

openssl コマンドでのファイルの暗号化と復号化

openssl を使ってファイルを暗号化する
まずは共通鍵暗号方式、パスワードで暗号化する方法
使用できる暗号方式は次の通り

root@bt:~# openssl ciphers
DHE-RSA-AES256-SHA
DHE-DSS-AES256-SHA
AES256-SHA
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DES-CBC3-SHA
DES-CBC3-MD5
DHE-RSA-AES128-SHA
DHE-DSS-AES128-SHA
AES128-SHA
RC2-CBC-MD5
RC4-SHA
RC4-MD5
RC4-MD5
EDH-RSA-DES-CBC-SHA
EDH-DSS-DES-CBC-SHA
DES-CBC-SHA
DES-CBC-MD5
EXP-EDH-RSA-DES-CBC-SHA
EXP-EDH-DSS-DES-CBC-SHA
EXP-DES-CBC-SHA
EXP-RC2-CBC-MD5
EXP-RC2-CBC-MD5
EXP-RC4-MD5
EXP-RC4-MD5
元のファイル input_file.txt を作成

root@bt:~# hexdump -C input_file.txt 
00000000  48 65 6c 6c 6f 20 77 6f  72 6c 64 21 21 0a 54 68  |Hello world!!.Th|
00000010  69 73 20 69 73 20 74 65  73 74 20 66 69 6c 65 0a  |is is test file.|
00000020
root@bt:~# 
まずは共通鍵暗号方式で作成したファイルを暗号化する
暗号方式は AES128 を指定
オプションの -k はパスワードを指定するが、ない場合は対話式で入力

root@bt:~# openssl enc -e -aes128 -in input_file.txt -out out_file.enc -k password 
root@bt:~# file out_file.enc
out_file.enc: data
root@bt:~# hexdump -C out_file.enc 
00000000  53 61 6c 74 65 64 5f 5f  bc ac 6a 90 87 c9 a6 fb  |Salted__..j.....|
00000010  f6 b4 cf e9 cd fe e1 51  2c e1 04 fb 3d 94 3e 5e  |.......Q,...=.>^|
00000020  59 db 69 62 80 d9 70 37  f2 e8 ec a9 88 b8 3f 98  |Y.ib..p7......?.|
00000030  06 20 50 36 38 4c 63 97  8b c3 2c b1 d0 cd 6e 1d  |. P68Lc...,...n.|
00000040
root@bt:~# 
openssl の共通鍵暗号方式で暗号化した場合の特徴としてバイナリの先頭部分が Salted__ から始まる
ファイルタイプとしては data としてしか表示されないので、この部分を参考に判定可能
復号化するには次のコマンド

root@bt:~# openssl enc -d -aes128 -in out_file.enc -k password
Hello world!!
This is test file
root@bt:~# 
公開鍵暗号方式で暗号化する場合には鍵の作成から行う
秘密鍵の生成ではそのまま作成する場合と、鍵自体を暗号化する作成方法がある
平文で秘密鍵を作成する場合は下記のとおり

root@bt:~# openssl genrsa -out private.pem
Generating RSA private key, 512 bit long modulus
.........++++++++++++
.++++++++++++
e is 65537 (0x10001)
root@bt:~# 
root@bt:~# more private.pem 
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJBAMXq7bBMGF2pjDxsBpcFH3Sr4GrTHD1wAXsy+muxOwg4aulpUf3D
qDxJTw3uijLI3b6/sRL9gupIvSSxMOkZ5OECAwEAAQJABl20H4OTFRArDpZ678ie
ZmZQ5Z68vc0ofwn4vBYLTAxWAI+8YvTX6hZxkaB7BLFYIwc5ufO4TcRzeOeG2kE9
AQIhAPDQenJke3rcPpXJe8f8X0eWuWx/vmaXhqlqi9JMGUdZAiEA0mX1jx64CoeW
qq+N4iF6+TU3uYCclwrF0AprWYoL4MkCIGzw43P8oR/joyyACc9fDHuGZDwBTlF7
GyBpYvewFX+BAiBrnJqsSRn4yMDXLFN1hYpQTFfkGVP+LRRgA/REJ8dLgQIgFWUV
QVhh7g+WsNhAuSOH9ULQoPu49F/m8rIIazcyo/8=
-----END RSA PRIVATE KEY-----
秘密鍵自体を AES128 で暗号化して作成する場合は次のとおり
この場合にはパスフレーズの入力が必要になる

root@bt:~# openssl genrsa -aes128 -out private.pem
Generating RSA private key, 512 bit long modulus
..++++++++++++
....++++++++++++
e is 65537 (0x10001)
Enter pass phrase for private.pem: password
Verifying - Enter pass phrase for private.pem: password
root@bt:~# 
root@bt:~# more private.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,3A2BDD1E928872053C69907E845E24B9

LjOYTMt8jfIM0TVO1j8pErdYVz3tNltOyojzIq/TH1aIET0qnEHzneU6+AEpDyZi
hZ/zFH5N0+Hlma7T3lw5nAoSWX25ssQP26xcMP0Inr12gUHgr2S8H0Mn7wHVpw4r
9fRciENvEaQDJCI3oYbMmb3gqIe0J6P+jG2FS0S/oBekusmhioR/77bBQWK3sUtq
OPmzPg/pI8dLvdR06UMFyD1VtcNyZLS3/4IxktI8t4Z9tvQZqW54hstSPhwagSpX
jLW+VG857yYyD4ZRqYU/eb6YztbxUVS3TPU+R7rorSEze+87Mb846004wZJGLery
+Co/mRAP4G+xYMT8qGKQIGYKym9bQlYhnQzmMWqEgoKpWYQ3Z3xoQ/I40Tpv+DdO
AF4JiSLedzaW2oCU0BYGV9pTnEEToFM5BVjpXoqpJ//9icb93vXb1tDnqjwc0CT+
-----END RSA PRIVATE KEY-----
次に公開鍵を作成する
暗号化した秘密鍵で公開鍵を作る場合にはパスフレーズが必要になる

root@bt:~# openssl rsa -pubout -in private.pem -out public.pem
Enter pass phrase for private.pem:
writing RSA key
root@bt:~# more public.pem 
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMG8Ax/J6pdjlcNpfTpSsaDYJjNzxsSB
ftrIjQvgdtXIMSWSfDRNjiralgIkigbeTGtse/awqmU6wJjB7b57OjkCAwEAAQ==
-----END PUBLIC KEY-----
root@bt:~# 
作成した公開鍵でファイルを暗号化するには次のとおり

root@bt:~# openssl rsautl -encrypt -pubin -inkey public.pem -in input_file.txt -out out_file.enc
root@bt:~# hexdump -C out_file.enc 
00000000  67 a0 91 5f f0 f5 22 a1  6d e8 c5 3c 20 af 14 5c  |g.._..".m..< ..\|
00000010  2b 63 48 bf 23 59 2a 89  1c 97 4e 5d 9a 2c 20 50  |+cH.#Y*...N]., P|
00000020  a4 c2 7f b1 25 2a 9d f7  a0 3d 16 85 98 95 98 4a  |....%*...=.....J|
00000030  66 22 3b 5a 30 49 0d 26  51 03 c5 93 cc 75 35 1b  |f";Z0I.&Q....u5.|
00000040
共通鍵方式とは異なり先頭ビットが異なる
このファイルを復号するには次のコマンドを使用

root@bt:~# openssl rsautl -decrypt -inkey private.pem -in out_file.enc 
Enter pass phrase for private.pem:
Hello world!!
This is test file
root@bt:~# 

3 件のコメント:

  1. 自分は学生で、情報セキュリティに興味があります。
    将来は、セキュリティに関わる職に就きたいと思っています。
    Sec-v6さんは、どのような書籍やサイト、学校で勉強していますか?

    返信削除
    返信
    1. 興味のある部分について手当たり次第調べているだけなので、特定のサイトというのはないです。
      あえて言えば @IT ぐらいでしょうか。

      書籍はブログの中で紹介しているものを読んだりはしましたが、興味のない部分などもあるので、リファレンス的に使っているだけです。
      あまり参考になる回答になっていませんが。。。

      削除
    2. 返信ありがとうございます。
      参考にさせていただきます。

      削除