OpenSSLは改行文字を含まないBase64データをデコードできますか?

OpenSSLは改行文字を含まないBase64データをデコードできますか?

私のbash変数には2つのBase64データがあります。 Base64データでよく使用される改行は空白に置き換えられ、変数は基本的に非常に長い1行の文字列です。

変数に含まれている2つのBase64データチャンクをデコードできますが、これを実行しようとすると少し違いがあります。私はこれを正しく処理しているのか、改行文字を含まないBase64データをデコードするより良い方法があるのか​​を知りたいです。これが私が持っているものです:

最初のチャンクは350文字で、次のように正常にデコードできます。

echo ${DATA::350} | openssl base64 -d | wc -c
256

2番目のブロックには5745文字がありますが、上記のコマンドは期待した結果を生成しません。つまり:

$ echo {DATA:350} | openssl base64 -d | wc -c
432

しかし、改行文字を入れ直すとうまくいきます。

$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240

行の長さに問題があると予想されます。最初のチャンクは避けられるほど小さく、これは使用されたBase64デコーダの機能であるようです(2つの一般的な機能とはbase64異なるopenssl base64動作)。

base64代わりに、デコーダはopenssl base64最初の無効な文字(スペース)で停止するため、最初の「行」(48バイトの出力データ)のみがデコードされますが、OpenSSLは432文字(9「行」)を出力します。コマンドbase64に無視オプションがありますごみしたがって、次のように動作します。

$ echo ${DATA:350} | base64 -d -i | wc -c
4240

OpenSSLデコーダにはそのようなオプションがないようです。

また、空白の削除は完全に機能しますbase64が、以下では機能しませんopenssl base64

$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400

$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240

そのため、最終的にはデコードされたデータをさらに処理する必要があったので、改行文字を置き換えてOpenSSLデコーダを使用しました。

$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...

しかし、私は理解したいです。OpenSSLは改行文字を含まないbase64データをデコードできますか?

答え1

そうでなければ必要Spaceはopenssl次のオプションを使用してこれを処理します-A

だから:

$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)                
$ echo "$x" | wc
      1       1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp 
$ 

base64データはすべて1行にあり、デコードできることがわかります。

man encこの-Aオプションについて説明してください。

スペースを保持する必要がある場合は、スペースを削除する必要があります(に変換するか、'\n'削除して使用-A)。

関連情報