it-swarm-ja.com

OpenSSLは0.9.8oと1.1.0fの間で不正な復号化を行う

OpenSSLを使用してクリアテキストをエンコードし、複数のリモートサーバーでデコードします。 Debian 9 Stretchの互換性を確認するためにスクリプトをテストしていたところ、エラーが見つかりました。

これが私がテストする方法です:文字列をエンコードするDebian 6、OpenSSL 0.9.8o:

# echo "Hi guys" | openssl des3 -salt -a -k "testkey"
U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=

同じサーバーでのデコード:

# echo "U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=" | openssl des3 -salt -a -d -k "testkey"
Hi guys

文字列をデコードするDebian 9、OpenSSL 1.1.0f:

# echo "U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=" | openssl des3 -salt -a -d -k "testkey"
bad decrypt
140259873273088:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:../crypto/evp/evp_enc.c:535:
z���AR�

デコード処理中:

Debian 7、OpenSSL 1.0.1t:

$ echo "U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=" | openssl des3 -salt -a -d -k "testkey"
Hi guys

Debian 8、OpenSSL 1.0.1t

# echo "U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=" | openssl des3 -salt -a -d -k "testkey"
Hi guys

そのため、Debian 9、OpenSSL 1.1.0fテストサーバーでエンコードをテストしました。

# echo "Hi guys" | openssl des3 -salt -a -k "testkey"
U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=

そして、同じサーバーでのデコードが機能しています:

# echo "U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=" | openssl des3 -salt -a -d -k "testkey"
Hi guys

しかし、デコードは他の3つのサーバー(Debian 6、OpenSSL 0.9.8o)では機能しません。

# echo "U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=" | openssl des3 -salt -a -d -k "testkey"
bad decrypt
12605:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:330:
��Rv��

Debian 7、OpenSSL 1.0.1t:

$ echo "U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=" | openssl des3 -salt -a -d -k "testkey"
bad decrypt
139771367589544:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:516:
▒▒Rv▒▒

Debian 8、OpenSSL 1.0.1t:

# echo "U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=" | openssl des3 -salt -a -d -k "testkey"
bad decrypt
139719827605136:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:516:
▒▒Rv▒▒

OpenSSLの依存関係を確認し、各バージョンの複数のサーバーでテストしました。

8
Leahkim

すみません、数分後、私はSebastian Andrzej SiewiorによるDebianバグトラッカーで答えを見つけました。

Debianバグレポート#843064

ええと。キーを作成するために、デフォルトのダイジェストをmd5からsha256に変更しました。 1.1に「-md md5」を追加した場合。 opensslの場合は機能します。逆に言うと、1.0を満足させるには '-md sha256'が必要です。

したがって、Debian 9で「-md md5」を追加すると、古いOpenSSLエンコードされた文字列で動作します。

# echo "U2FsdGVkX1+I3EBhXjqrm+MJOmKRpj+Y5TtNJaJjI/s=" | openssl des3 -salt -md md5 -a -d -k "testkey"
Hi guys

古いDebianに「-md sha256」を追加すると、新しいOpenSSLエンコード文字列も機能します。

# echo "U2FsdGVkX1+p/LDtOotR/gmVTfGL+LabNPvLxKqwbOk=" | openssl des3 -md sha256 -salt -a -d -k "testkey"
Hi guys

スレッドを維持して他の人の時間を節約する:)

16
Leahkim