corvvs / orenetutils-ssl

ssl, とあるがあまりsslっぽいことはしない
0 stars 0 forks source link

add: DES #47

Open corvvs opened 1 year ago

corvvs commented 1 year ago

要件

image

corvvs commented 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# 
corvvs commented 1 year ago

今のバージョンのopensslでdesで暗号化するにはオプション-provider legacy -provider defaultが必要らしい。

つけなくてもうまく行くことあるけどね。

corvvs commented 1 year ago

openssl desで色々やる

CBCモード

$ openssl des-cbc -e -in test.txt -pass pass:aaa -iv 0123456789abcdef -pbkdf2 -provider legacy -provider default > out

複合する場合はこう:

$ 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モード

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�}�$ 
$
corvvs commented 1 year ago

ソルトについて

暗号化編

# まずソルトを指定しないで暗号化する
$ 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
$ 
corvvs commented 1 year ago

トリプルDES

ひとことで

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ビット生成することになる。

corvvs commented 1 year ago

パディングアルゴリズム

PKCS#7パディング

データ列をD, そのサイズをN, ブロックサイズをBとする.\ この時, パディングに使うバイトPB - (N % B)で定める.\ Dの末尾にPP回連結してパディングとする。

PKCS#5パディング

PKCS#7パディングにおいて, B = 8としたもの。

corvvs commented 1 year ago

サブコマンドごとの比較表

モード ランナー ブロック処理 パディング 鍵長 単位鍵長 鍵数 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

内部パラメータ

ブロック処理

corvvs commented 1 year ago

主要パラメータの導出方法

ブロック鍵

ソルト

初期化ベクトル

corvvs commented 9 months ago

リハビリノート

しばらく寝かせていたため・・・

DESの計算に必要なデータ