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


9

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)最初の無効な文字(空白)で停止し、したがってだけOpenSSLの出力432文字(9「行」)に対し、最初の「行」(出力データの48バイト)をデコードします。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データをデコードできることを理解したいと思いますか?


FWIW bashはtr${var//old[/new}- を使用せずに、文字自体を変更または削除できますが、部分文字列と同時にはできません。
dave_thompson_085 2017

回答:


17

スペースが必要ない場合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)。


この-Aオプションは、私が最初に試みたものの1つでしたが、スペースを削除しようとする前にそうしました。manページでは、スペースの問題については何も触れられていません。とにかく、私はスペースを削除してもう一度試したところ、うまくいきました。それはまだ厄介ですが、少なくともそれだけtr -d ' 'です。これは処理できず、空白を無視できるのは残念です(base64canのように)。
-starfry

2
RFC 4648は、厳密に言えばスペース(セクション3.3)および改行(セクション3.1)はbase64では禁止されていると述べています。セクション3.3では、この場合、実装はデータを拒否する必要があると述べています。したがってopenssl base64 -A、セキュリティ暗号化ツールに期待される厳密な解釈に近いです。coreutilsのbase64方が寛大だと思います。
スティーブンハリス

2
OpenSSLは1990年代(4648または3548より前)にbase64を実装し、主に「PEM」(実際にはPEMのような)ファイルとS / MIMEファイルの読み取りと書き込みを行いました。どちらも改行が必要です。-A基本的には、「私たちはEVP_{En,De}codeBlock要素を持っているので、人々にそれらを使わせるかもしれません」です。
dave_thompson_085 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.