Openssl
OpenSSL 可以解碼不包含換行符的 base64 數據嗎?
我在 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 解碼器的一個特性(兩個常用的
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 數據嗎?
如果您不需要空格,那麼將使用以下選項
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
)。