Saya punya dua potongan data base64 dalam variabel bash. Pemutusan garis biasa dalam data base64 telah digantikan oleh spasi dan variabel pada dasarnya adalah satu string satu baris yang sangat panjang.
Saya dapat men-decode dua potongan data base64 yang terkandung dalam variabel tetapi saya mengalami beberapa nuansa ketika mencoba melakukannya. Saya ingin memahami apakah saya mendekati ini dengan benar atau apakah ada cara yang lebih baik untuk mendekode data base64 yang tidak mengandung jeda baris. Inilah yang saya miliki:
Potongan pertama adalah 350 karakter dan saya dapat mendekodekannya dengan sukses seperti ini:
echo ${DATA::350} | openssl base64 -d | wc -c
256
Potongan kedua adalah 5745 karakter tetapi perintah di atas tidak menghasilkan hasil yang diharapkan. yaitu:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Namun, itu berfungsi jika saya mengembalikan garis:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Saya berharap ada beberapa masalah panjang garis bahwa potongan pertama cukup kecil untuk dihindari, dan itu akan muncul sebagai fitur dari decoder base64 yang digunakan (dua yang biasa, base64
dan openssl base64
, berperilaku berbeda).
The base64
decoder (bukan openssl base64
) berhenti di karakter yang tidak valid pertama (spasi) dan oleh karena itu hanya menerjemahkan pertama "line" (48 byte data output) sedangkan OpenSSL output 432 karakter (9 "garis"). The base64
perintah memiliki opsi untuk mengabaikan sampah , jadi ini bekerja:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
Dekoder OpenSSL tampaknya tidak memiliki opsi seperti itu.
Juga, menghapus whitespace sepenuhnya berfungsi untuk base64
tetapi tidak openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Jadi, pada akhirnya, saya mengganti baris baru dan menggunakan decoder OpenSSL karena saya masih perlu memproses data yang sudah diterjemahkan:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Tapi saya ingin mengerti Bisakah OpenSSL mendekode data base64 yang tidak mengandung jeda baris?
tr
, menggunakan${var//old[/new}
- tetapi tidak pada saat yang sama dengan substring.Jawaban:
Jika Anda tidak membutuhkan spasi maka
openssl
akan menangani ini dengan-A
opsi:Begitu:
Kita dapat melihat data base64 semuanya dalam satu baris, dan dapat diterjemahkan.
man enc
menjelaskan-A
opsi.Jika Anda perlu menjaga spasi maka Anda harus menghapusnya (baik dengan mengonversi
'\n'
atau menghapus dan menggunakan-A
).sumber
-A
pilihan adalah salah satu hal pertama yang saya mencoba, tapi saya melakukannya sebelum mencoba untuk menghapus spasi dan kemudian "pindah" ketika itu tidak bekerja! Halaman manual tidak menyebutkan apa pun tentang spasi yang menjadi masalah. Ngomong-ngomong, saya baru saja mencobanya lagi dengan spasi yang dihapus dan tidak berfungsi. Ini masih jahat tetapi setidaknya itu hanyatr -d ' '
. Sayang tidak bisa memprosesnya dan mengabaikan ruang putih (sepertibase64
kaleng).openssl base64 -A
lebih dekat untuk menjadi interpretasi yang ketat, yang Anda harapkan dari alat enkripsi keamanan. Saya kira coreutilbase64
lebih lunak.-A
pada dasarnya adalah "kita punyaEVP_{En,De}codeBlock
faktor, mungkin juga membiarkan orang menggunakannya".