Bagaimana Saya bisa memecahkan kode string base64 dari baris perintah?

Saya ingin menulis skrip bash untuk memecahkan kode string base64. Misalnya saya ketik decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== dan mencetak Aladdin:open sesame dan kembali ke prompt.

Sejauh ini saya telah mencoba file bash sederhana yang berisi python -m base64 -d $1 tetapi perintah ini mengharapkan nama file bukan string. Apakah ada perintah non-interaktif lain (tidak harus dalam modul Python) yang dapat saya jalankan dari baris perintah untuk mencapai ini, tanpa harus menginstal paket tambahan? (Atau jika saya melakukannya, sesuatu yang super-minimal.)

Hanya menggunakan base64 program dari coreutils paket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Atau, untuk menyertakan karakter baris baru

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

output (termasuk baris baru):

Aladdin:open sesame

openssl juga dapat menyandikan dan mendekode base64

$ openssl enc -base64 <<< 'Hello, World!'SGVsbG8sIFdvcmxkIQo=$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=Hello, World!

EDIT: contoh di mana string yang dikodekan base64 berakhir di beberapa baris:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=$ openssl enc -base64 -d << EOF> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=> EOFAnd if the data is a bit longer, the base64 encoded data will span multiple lines.

Ini dia!

Tambahkan berikut ini ke bagian bawah ~/.bashrc berkas:

decode () {  echo "$1" | base64 -d ; echo}

Sekarang, buka Terminal baru dan jalankan perintah.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ini akan melakukan apa yang Anda minta dalam pertanyaan anda.

Dengan dependensi asli Anda, Anda dapat melakukan ini dengan sedikit modifikasi pada skrip asli Anda:

echo $1 | python -m base64 -d

Jika Anda tidak melewatkan nama file, modul python itu membaca dari input standar. Untuk menyalurkan parameter pertama ke dalamnya, Anda dapat menggunakan echo $1 |.

Saya melakukan komentar baris perintah base64 di http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Jadi saya mengeluarkan peringatan saat menggunakan decoding openssl base64 :

 openssl base64 -e <<< 'Welcome to openssl wiki' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kKopenssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'Welcome to openssl wiki

peringatan panjang baris base64 dibatasi hingga 64 karakter secara default di openssl :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line that splits...' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo YXQgc3BsaXRzLi4uCg==openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

>= Tidak ada !

untuk dapat memecahkan kode baris base64 tanpa umpan baris yang melebihi 64 karakter Gunakan-opsi :

openssl base64 -d -A <<<'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='Welcome to openssl wiki with a very long line that splits...

Ini lebih baik untuk sebenarnya membagi base64 menghasilkan 64 karakter baris karena-opsi bermasalah ( batas dengan file panjang ).

Menggunakan perl

perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Atau sama dengan python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Hanya untuk menambahkan cara lain untuk melakukannya:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'

Aku punya beberapa saat rambut-menarik yang satu ini karena base64 Alat Linux dan juga openssl dapat memecahkan kode, memang. Tetapi saya memiliki file yang dikodekan base64 khusus ini yang menerjemahkan ke nilai yang sedikit salah. Beberapa byte cocok, tetapi kemudian ada kehadiran ini EF BF BD EF BF BD ketika saya melihat di hexedit penampil. Dan kemudian urutan byte berikutnya Cocok lagi jika dibandingkan dengan output yang diharapkan diterjemahkan dengan benar. Ini urutan aneh byte mendapat dimasukkan dalam di-betweens, kadang-kadang sebagai EF BF BD hanya.

Untuk mengatasi masalah ini, saya harus melihat bagaimana pengirim Java mengkodekannya dan kemudian saya membuat decoder java base64 kecil. Dan sekarang saya bisa diterjemahkan ke nilai yang diharapkan.

Berikut adalah potongan kecil yang melakukannya: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

Pertanyaan bagus. Dan terima kasih atas petunjuk Anda, sekarang saya tahu ’ python-m base64-h` bisa menjadi berguna.