Open corvvs opened 1 year ago
root@8c3326e722f1:/home# openssl des --help
Usage: des [options]
General options:
-help Display this summary
-list List ciphers
-ciphers Alias for -list
-e Encrypt
-d Decrypt
-p Print the iv/key
-P Print the iv/key and exit
-engine val Use engine, possibly a hardware device
Input options:
-in infile Input file
-k val Passphrase
-kfile infile Read passphrase from file
Output options:
-out outfile Output file
-pass val Passphrase source
-v Verbose output
-a Base64 encode/decode, depending on encryption flag
-base64 Same as option -a
-A Used with -[base64|a] to specify base64 buffer as a single line
Encryption options:
-nopad Disable standard block padding
-salt Use salt in the KDF (default)
-nosalt Do not use salt in the KDF
-debug Print debug info
-bufsize val Buffer size
-K val Raw key, in hex
-S val Salt, in hex
-iv val IV in hex
-md val Use specified digest to create a key from the passphrase
-iter +int Specify the iteration count and force the use of PBKDF2
Default: 10000
-pbkdf2 Use password-based key derivation function 2 (PBKDF2)
Use -iter to change the iteration count from 10000
-none Don't encrypt
-* Any supported cipher
Random state options:
-rand val Load the given file(s) into the random number generator
-writerand outfile Write random data to the specified file
Provider options:
-provider-path val Provider load path (must be before 'provider' argument if required)
-provider val Provider to load (can be specified multiple times)
-propquery val Property query used when fetching algorithms
root@8c3326e722f1:/home#
今のバージョンのopensslでdesで暗号化するにはオプション-provider legacy -provider default
が必要らしい。
つけなくてもうまく行くことあるけどね。
openssl des
で色々やる$ openssl des-cbc -e -in test.txt -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default > out
des-cbc
暗号利用モード CBC(Cipher Block Chaining)-e
暗号化(encryption)を行う-pass pass:aaa
パスフレーズとしてaaa
を使用-iv 0123456789abcdef
初期化ベクトル(iv)として16進バイト列0123456789abcdef
を使用-pbkdf2
鍵導出関数としてPBKDF2を使用(パスフレーズからのブロック鍵算出に使用)-provider legacy -provider default
おまじない複合する場合はこう:
$ openssl des-cbc -d -in out -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default
ここでパスフレーズを変えるとぐちゃぐちゃなものが出てくるが、\
iv
を変えると、元のファイルと_少しだけ_違う結果になる。\
これはCBCモードにおける復号時のiv
は最初のブロック(64ビット=8バイト=8文字)にのみ影響するため。
$ cat test.txt
one,two
,three,
four,fi
ve,six,
seven,e
ight$
$ openssl des-cbc -e -in test.txt -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default > out
# 同じivで復号
$ openssl des-cbc -d -in out -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default
one,two
,three,
four,fi
ve,six,
seven,e
ight$
# 全然違うivで復号
$ openssl des-cbc -d -in out -pass pass:aaa -iv abababababababab -pbkdf2 -provider legacy -provider default
���Vw N,three,
four,fi
ve,six,
seven,e
ight$
$
OFB(Output Feedback)は, CBCやCFB(Cipher Feedback)とは異なり, 復号時のivが全ブロックに波及する。
$ openssl des-ofb -e -in test.txt -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default > out
# 同じivで復号
$ openssl des-ofb -d -in out -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default
one,two
,three,
four,fi
ve,six,
seven,e
ight
# 全然違うivで復号
$ openssl des-ofb -d -in out -pass pass:aaa -iv abababababababab -pbkdf2 -provider legacy -provider default
�^�ݵՎ��L���F��Q)�DR}��~'�0��v���$
lj�}�$
$
# まずソルトを指定しないで暗号化する
$ openssl des-cbc -e -in test.txt -pass pass:aaa -pbkdf2 -iv 0123456789abcdef -provider legacy -provider default > out
$ hexdump -C out
00000000 53 61 6c 74 65 64 5f 5f a3 d4 28 58 a9 7a 30 a7 |Salted__..(X.z0.|
00000010 9e 1f 87 6d 86 66 2c e7 bb 08 eb 7d 07 a7 95 88 |...m.f,....}....|
00000020 5a 3f 8d be 7a 66 17 b4 ed f5 a4 ee a2 5f 5e 0d |Z?..zf......._^.|
00000030 75 cc 80 4d d6 6f 7c 01 d8 88 d1 d2 ee a8 f2 70 |u..M.o|........p|
00000040 c9 34 8e 1e c3 d9 50 b6 |.4....P.|
00000048
# 自動生成されたソルトは a3d42858a97a30a7
# → これを明示的に与えて暗号化してみる
$ openssl des-cbc -e -in test.txt -pass pass:aaa -pbkdf2 -S a3d42858a97a30a7 -iv 0123456789abcdef -provider legacy -provider default > out_s
$ hexdump -C out_s
00000000 9e 1f 87 6d 86 66 2c e7 bb 08 eb 7d 07 a7 95 88 |...m.f,....}....|
00000010 5a 3f 8d be 7a 66 17 b4 ed f5 a4 ee a2 5f 5e 0d |Z?..zf......._^.|
00000020 75 cc 80 4d d6 6f 7c 01 d8 88 d1 d2 ee a8 f2 70 |u..M.o|........p|
00000030 c9 34 8e 1e c3 d9 50 b6 |.4....P.|
00000038
# 最初の暗号化結果の最初の16バイト(=ソルト部分)以降と等しい
$
# ソルトつき暗号化データをソルトなしで復号する
$ openssl des-cbc -d -in out -pass pass:aaa -pbkdf2 -iv 0123456789abcdef -provider legacy -provider default | hexdump -C
# 暗号化データの冒頭に含まれるソルトを自動で感知して復号しているはず
00000000 6f 6e 65 2c 74 77 6f 0a 2c 74 68 72 65 65 2c 0a |one,two.,three,.|
00000010 66 6f 75 72 2c 66 69 0a 76 65 2c 73 69 78 2c 0a |four,fi.ve,six,.|
00000020 73 65 76 65 6e 2c 65 0a 69 67 68 74 2c 6e 69 0a |seven,e.ight,ni.|
00000030
# では, あえてソルトを明示的に指定して復号すると...?
$ openssl des-cbc -d -in out -pass pass:aaa -pbkdf2 -S a3d42858a97a30a7 -iv 0123456789abcdef -provider legacy -provider default | hexdump -C
# 暗号化データ冒頭の Salted__........ をソルトではなく元のデータして復号してしまうので, 最初の方がおかしくなる.
# (元のデータの8バイト目=2ブロック目以降が正しく復号できるのはCBCモードの特性によるもの)
00000000 78 73 fd 48 38 fe c8 24 a4 7a b4 23 e2 ca 7e 60 |xs.H8..$.z.#..~`|
00000010 cd 99 08 13 54 a6 92 42 2c 74 68 72 65 65 2c 0a |....T..B,three,.|
00000020 66 6f 75 72 2c 66 69 0a 76 65 2c 73 69 78 2c 0a |four,fi.ve,six,.|
00000030 73 65 76 65 6e 2c 65 0a 69 67 68 74 2c 6e 69 0a |seven,e.ight,ni.|
00000040
$
# ソルトを指定して暗号化したデータをソルトなしで復号する
$ openssl des-cbc -d -in out_s -pass pass:aaa -pbkdf2 -iv 0123456789abcdef -provider legacy -provider default | hexdump -C
bad magic number # 怒られる
$
# 正しいソルトを指定してあげれば大丈夫
$ openssl des-cbc -d -in out_s -pass pass:aaa -pbkdf2 -S a3d42858a97a30a7 -iv 0123456789abcdef -provider legacy -provider default | hexdump -C
00000000 6f 6e 65 2c 74 77 6f 0a 2c 74 68 72 65 65 2c 0a |one,two.,three,.|
00000010 66 6f 75 72 2c 66 69 0a 76 65 2c 73 69 78 2c 0a |four,fi.ve,six,.|
00000020 73 65 76 65 6e 2c 65 0a 69 67 68 74 2c 6e 69 0a |seven,e.ight,ni.|
00000030
$
DESにおけるブロック暗号化処理を三重化したもの。
DESにおけるブロック暗号化およびブロック復号処理を以下のように書く:
Kをブロック鍵, Pをメッセージとして
encrypt(K, P) 暗号化
decrypt(K, P) 復号
この時, トリプルDESにおけるブロック暗号化・ブロック復号処理は
K1, K2, K3をブロック鍵, Pをメッセージとして
encrypt3(K1, K2, K3, P) = encrypt(K3, decrypt(K2, encrypt(K1, P))) 暗号化
decrypt3(K1, K2, K3, P) = decrypt(K1, encrypt(K2, decrypt(K3, P))) 復号
となる。
DES → トリプルDESで変換するのはブロック処理のみなので、暗号化利用モードについては特に影響がない、はず。
ブロック処理を3回やるので鍵は3つ(K1, K2, K3)必要になるが, 全て異なる鍵にしなくても動作はする。\ 特にK1 = K2 = K3の場合, これはただのDESになる(K1で暗号化→K1で解読→K1で暗号化)。
またK1 = K3 != K2 の時も、鍵強度は下がるがDESよりは強い。
(以下は本repo独自仕様)
鍵を入力として受け取る場合, 直接指定では64*3 = 192
ビット必要になる。\
また初期化ベクトルも64*3 = 192
ビット必要なので、合わせて384ビット。\
鍵導出を行う場合は384ビット生成することになる。
データ列をD
, そのサイズをN
, ブロックサイズをB
とする.\
この時, パディングに使うバイトP
をB - (N % B)
で定める.\
D
の末尾にP
をP
回連結してパディングとする。
PKCS#7パディングにおいて, B = 8
としたもの。
モード | ランナー | ブロック処理 | パディング | 鍵長 | 単位鍵長 | 鍵数 | IV | |
---|---|---|---|---|---|---|---|---|
des |
CBC | run_des_cbc |
des_b1 |
要 | 8 | 8 | 1 | 要 |
des-ecb |
ECB | run_des_ecb |
des_b1 |
要 | 8 | 8 | 1 | 不要 |
des-cbc |
CBC | run_des_cbc |
des_b1 |
要 | 8 | 8 | 1 | 要 |
des-cfb |
CFB | run_des_cfb |
des_b1 |
不要 | 8 | 8 | 1 | 要 |
des-ofb |
OFB | run_des_ofb |
des_b1 |
不要 | 8 | 8 | 1 | 要 |
des-ctr |
CTR | run_des_ctr |
des_b1 |
不要 | 8 | 8 | 1 | (nonce) |
des-pcbc |
PCBC | run_des_pcbc |
des_b1 |
要 | 8 | 8 | 1 | 要 |
des3 |
CBC | run_des3_cbc |
des_b3 |
要 | 24 | 8 | 3 | 要 |
des3-ecb |
ECB | run_des3_ecb |
des_b3 |
要 | 24 | 8 | 3 | 不要 |
des3-cbc |
CBC | run_des3_cbc |
des_b3 |
要 | 24 | 8 | 3 | 要 |
des3-ofb |
OFB | run_des3_ofb |
des_b3 |
不要 | 24 | 8 | 3 | 要 |
ECB | CBC | CFB | OFB | CTR | PCBC
des_b1 | des_b3
しばらく寝かせていたため・・・
要件
des-ecb
des-cbc
des
(des-cbc
と同値)des-cfb
des-ofb
des-ctr
des-pcbc
des3-ecb
des3-cbc
des3-ofb
des3
(des3-cbc
と同じ)HMAC-SHA256
がデフォルト-a
入力をbase64デコードし, 出力をbase64エンコードする-d
復号(decrypt)モード-e
暗号(encrypt)モード-i [path]
入力元指定-k [hexkey]
キーを16進で指定openssl des -K
と同じ(openssl des -k
ではない)-K val Raw key, in hex
-o [path]
出力先指定-p [password]
パスワードを(ASCIIで)指定openssl des -pass
とほぼ同じ-pass val Passphrase source
-s [hexsalt]
ソルトを16進で指定openssl des -S
と同じ-S val Salt, in hex
-v [initial vector]
初期化ベクタを16進で指定openssl des -iv
と同じ-iv val IV in hex