Links

Encode / Decode Data

How to transfer data with Base64 encoding and decoding.
Encoding is the process of taking characters (e.g., letters and numbers) and putting it in a format that is efficient for transmission and storage.
Decoding is the opposite, converting the encoded format back to the original characters.

Base64 Encode / Decode - Linux to Windows

# Original file contents
└─$ cat dir/file.txt
file contents
# On Linux, encode a file with base64
└─$ base64 ./myfiles.zip
UEsDBAoAAAAAAGFNWFYAAAAAAAAAAAAAAAAEABwAZGlyL1VUCQAD9cz4Y/XM+GN1eAsAAQToAwAA
BOgDAABQSwMECgAAAAAAZ01YVn55T3UOAAAADgAAAAwAHABkaXIvZmlsZS50eHRVVAkAAwHN+GP1
zPhjdXgLAAEE6AMAAAToAwAAZmlsZSBjb250ZW50cwpQSwECHgMKAAAAAABhTVhWAAAAAAAAAAAA
AAAABAAYAAAAAAAAABAA7UEAAAAAZGlyL1VUBQAD9cz4Y3V4CwABBOgDAAAE6AMAAFBLAQIeAwoA
AAAAAGdNWFZ+eU91DgAAAA4AAAAMABgAAAAAAAEAAACkgT4AAABkaXIvZmlsZS50eHRVVAUAAwHN
+GN1eAsAAQToAwAABOgDAABQSwUGAAAAAAIAAgCcAAAAkgAAAAAA
# On Windows, decode the base64
PS C:\Users\victim> [IO.File]::WriteAllBytes("C:\Users\victim\myfiles.zip", [Convert]::FromBase64String("UEsDBAoAAAAAAGFNWFYAAAAAAAAAAAAAAAAEABwAZGlyL1VUCQAD9cz4Y/XM+GN1eAsAAQToAwAA `
BOgDAABQSwMECgAAAAAAZ01YVn55T3UOAAAADgAAAAwAHABkaXIvZmlsZS50eHRVVAkAAwHN+GP1 `
zPhjdXgLAAEE6AMAAAToAwAAZmlsZSBjb250ZW50cwpQSwECHgMKAAAAAABhTVhWAAAAAAAAAAAA `
AAAABAAYAAAAAAAAABAA7UEAAAAAZGlyL1VUBQAD9cz4Y3V4CwABBOgDAAAE6AMAAFBLAQIeAwoA `
AAAAAGdNWFZ+eU91DgAAAA4AAAAMABgAAAAAAAEAAACkgT4AAABkaXIvZmlsZS50eHRVVAUAAwHN `
+GN1eAsAAQToAwAABOgDAABQSwUGAAAAAAIAAgCcAAAAkgAAAAAA"))
# View file contents
PS C:\Users\victim> type dir/file.txt
file contents

Base64 Encode / Decode - Windows to Linux

# Original file contents
PS C:\Users\victim> type .\mysecrets.txt
42
# On Windows, encode a file in base64
PS C:\Users\victim> [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content ".\mysecrets.txt")))
# On Linux, decode the base64
└─$ echo NDI= | base64 -d > mysecrets.txt
# View file contents
└─$ cat mysecrets.txt
42
There are different ways to encode that impact the outcome. E.g., the command above will work on "C:\Windows\system32\drivers\etc\hosts" but the decoded output will be all on a single line making it harder to read. See below for an alternative.
# On Windows, encode a file in base64
PS C:\Users\victim> [Convert]::ToBase64String((Get-Content -path "C:\Windows\system32\drivers\etc\hosts" -Encoding byte))e
# On Linux, decode the file
└─$ echo IyBDb3B5cmlnaHQgKGMpIDE5OTMtMjAwOSBNaWNyb3NvZnQgQ29ycC4NCiMNCiMgVGhpcyBpcyBhIHNhbXBsZSBIT1NUUyBmaWxlIHVzZWQgYnkgTWljcm9zb2Z0IFRDUC9JUCBmb3IgV2luZG93cy4NCiMNCiMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyBvZiBJUCBhZGRyZXNzZXMgdG8gaG9zdCBuYW1lcy4gRWFjaA0KIyBlbnRyeSBzaG91bGQgYmUga2VwdCBvbiBhbiBpbmRpdmlkdWFsIGxpbmUuIFRoZSBJUCBhZGRyZXNzIHNob3VsZA0KIyBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IGNvbHVtbiBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyBob3N0IG5hbWUuDQojIFRoZSBJUCBhZGRyZXNzIGFuZCB0aGUgaG9zdCBuYW1lIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgYXQgbGVhc3Qgb25lDQojIHNwYWNlLg0KIw0KIyBBZGRpdGlvbmFsbHksIGNvbW1lbnRzIChzdWNoIGFzIHRoZXNlKSBtYXkgYmUgaW5zZXJ0ZWQgb24gaW5kaXZpZHVhbA0KIyBsaW5lcyBvciBmb2xsb3dpbmcgdGhlIG1hY2hpbmUgbmFtZSBkZW5vdGVkIGJ5IGEgJyMnIHN5bWJvbC4NCiMNCiMgRm9yIGV4YW1wbGU6DQojDQojICAgICAgMTAyLjU0Ljk0Ljk3ICAgICByaGluby5hY21lLmNvbSAgICAgICAgICAjIHNvdXJjZSBzZXJ2ZXINCiMgICAgICAgMzguMjUuNjMuMTAgICAgIHguYWNtZS5jb20gICAgICAgICAgICAgICMgeCBjbGllbnQgaG9zdA0KDQojIGxvY2FsaG9zdCBuYW1lIHJlc29sdXRpb24gaXMgaGFuZGxlZCB3aXRoaW4gRE5TIGl0c2VsZi4NCiMJMTI3LjAuMC4xICAgICAgIGxvY2FsaG9zdA0KIwk6OjEgICAgICAgICAgICAgbG9jYWxob3N0DQo= | base64 -d > hosts