Openssl

OpenSSL 可以解碼不包含換行符的 base64 數據嗎?

  • July 30, 2016

我在 bash 變數中有兩塊 base64 數據。base64 數據中通常的換行符已被空格替換,變數基本上是一個非常長的單行字元串。

我可以解碼變數中包含的兩塊 base64 數據,但在嘗試解碼時遇到了一些細微差別。我想了解我是否正確地處理了這個問題,或者是否有更好的方法來解碼不包含換行符的 base64 數據。這是我所擁有的:

第一個塊是 350 個字元,我可以像這樣成功解碼它:

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

第二個塊是 5745 個字元,但上面的命令沒有產生預期的結果。IE:

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

但是,如果我把換行符放回去,它會起作用:

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

我希望第一個塊足夠小可以避免一些行長度問題,並且它似乎是正在使用的 base64 解碼器的一個特性(兩個常用的base64openssl 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 數據嗎?

如果您不需要空格,那麼將使用以下選項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數據都在一行上,可以解碼。

man enc解釋-A選項。

如果您需要保留空格,則需要刪除它們(通過轉換為'\n'或刪除並使用-A)。

引用自:https://unix.stackexchange.com/questions/299257