web-dev-qa-db-ja.com

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

Bash変数にbase64データの2つのチャンクがあります。 base64データ内の通常の改行はスペースに置き換えられ、変数は基本的に1つの非常に長い1行の文字列です。

変数に含まれているbase64データの2つのチャンクをデコードできますが、それを実行しようとするといくつかのニュアンスが発生しました。私がこれに正しく取り組んでいるかどうか、または改行が含まれていない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つの通常のbase64openssl base64、動作が異なります)。

base64デコーダー(openssl base64ではなく)は最初の無効な文字(空白)で停止するため、最初の "行"(48バイトの出力データ)をデコードするだけですが、OpenSSLは432文字(9 "行」)。 base64コマンドにはgarbageを無視するオプションがあるため、これは機能します。

$ 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データをデコードできますか?

8
starfry

needスペースがない場合、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を削除して使用します)。

16
Stephen Harris