openssl encコマンド: 共通鍵暗号による暗号化と復号


前提


ドキュメント


アルゴリズムを指定

暗号化・復号の際は、これ以外に鍵の長さや利用モードの組み合わせを指定する。


鍵の長さ


基本オプション

暗号名をサブコマンドとする使い方


使用できるアルゴリズムのリスト


暗号化と復号

# 暗号化: AES, 鍵の長さ256ビット
echo '平文' | openssl enc -e -aes256 -out aes.enc

# 復号: 標準出力
openssl enc -d -aes256 -in aes.enc

バイナリデータの暗号文を見たいとき

そのままでは文字化けする。hexdump -Cvで16進数(とASCII)表示できる。


ソルト: -saltオプション(デフォルト)

ソルト使用

echo -n 平文 | openssl enc -e -aes128 -pass pass:password | hexdump -Cv
00000000  53 61 6c 74 65 64 5f 5f  f8 48 d5 c9 1b 69 45 6b  |Salted__.H...iEk|
00000010  63 dd f3 fb df af 3d 30  dd 90 df ef 6f 87 b7 ef  |c.....=0....o...|

echo -n 平文 | openssl enc -e -aes128 -pass pass:password | hexdump -Cv
00000000  53 61 6c 74 65 64 5f 5f  2f b8 49 21 8e 35 dd 0b  |Salted__/.I!.5..|
00000010  87 3b 66 ae f7 67 4f ef  a4 0b 6a f8 d4 af cb 01  |.;f..gO...j.....|

[非推奨] ソルト不使用: -nosaltオプション

echo -n 平文 | openssl enc -e -aes128 -pass pass:password -nosalt | hexdump -Cv
00000000  c9 70 3c 42 74 2d 8d e1  13 56 3c c3 bd 0f b9 02  |.p<Bt-...V<.....|

echo -n 平文 | openssl enc -e -aes128 -pass pass:password -nosalt | hexdump -Cv
00000000  c9 70 3c 42 74 2d 8d e1  13 56 3c c3 bd 0f b9 02  |.p<Bt-...V<.....|

実際の鍵

# 鍵の長さ256ビット: 16進数(4ビット)*64文字
# ソルト不使用なら毎回同じ鍵
openssl enc -aes256 -P -pass pass:password -nosalt 
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94

ブロック暗号のパディング

固定長(ブロック)単位で暗号化するため、平文がブロックの長さに足りない部分は詰め合わせが行われる。

# 1文字(1バイト)を暗号化
# ソルトもパディングもなし(長さが合わないとエラー)
echo -n "a" | openssl enc -e -aes128 -pass pass:password -nosalt -nopad \
  | hexdump -Cv
140147893016464:error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length:evp_enc.c:475:

# パディングあり
echo -n "a" | openssl enc -e -aes128 -pass pass:password -nosalt \
  | hexdump -Cv
00000000  30 8e ff 82 ee 6c b9 4e  de 0e ef 1e 7f 19 9a 63  |0....l.N.......c|

ストリーム暗号はビット単位の暗号化

# 1文字(1バイト)を暗号化
# ソルトなし
echo -n "a" | openssl enc -e -rc4 -pass pass:password -nosalt \
  | hexdump -Cv
00000000  89                                                |.|

ブロック暗号の利用モード

ブロックごとに鍵をどう適用するか。

ECBモードで暗号文に繰り返しが出る例

# 平文: 1バイト文字16個(128ビット)(a...B)を2回繰り返し
plain=aaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaB
# 鍵: AESのECBモード、128ビット、ソルトもパディングもなし
echo -n "$plain" \
  | openssl enc -e -aes-128-ecb -pass pass:password -nosalt -nopad \
  | hexdump -Cv
00000000  79 74 ef 71 d8 0f 01 9e  32 aa 00 82 bf 60 fc d4  |yt.q....2....`..|
00000010  79 74 ef 71 d8 0f 01 9e  32 aa 00 82 bf 60 fc d4  |yt.q....2....`..|

# CBCでは繰り返さない
echo -n "$plain" \
  | openssl enc -e -aes128 -pass pass:password -nosalt -nopad \
  | hexdump -Cv
00000000  95 6f 03 a5 e7 cb ce b9  63 d9 1f ee ce fa 3e e4  |.o......c.....>.|
00000010  5d e0 b3 a5 46 ba 85 ec  cb 5e 05 a5 f8 e6 fe 64  |]...F....^.....d|