Skip to content

Why are atob and btoa not reversible

I’m trying to find a simple way to record and temporarily obfuscate answers to “quiz” questions I’m writing in Markdown. (I’ll tell the students the quiz answers during the presentation, so I’m not looking for any kind of secure encryption.)

I thought I could use atob('message I want to obfuscate') then tell students they can use btoa() in their developer tools panel to reverse the process. However the following does not return ‘one’:

btoa( atob('one') )

Does anyone know why this doesn’t return 'one'? Are there other methods built into JavaScript that will allow one to loosely encrypt and decrypt a message? (I’m working with absolute beginners who might be confused by functions and who would be very confused trying to add libraries to a page).

Answer

That is the reason.

In Base64 encoding, the length of output encoded String must be a multiple of 3. If it’s not, the output will be padded with additional pad characters (=). On decoding, these extra padding characters will be discarded.

var string1 = "one",
  string2 = "one2";

console.log("Value of string1", string1)
console.log("Decoded string1", atob(string1))
console.log("Encoded string1", btoa(atob(string1)))
console.log("-------------------------------------")
console.log("Value of string2", string2)
console.log("Decoded string2", atob(string2))
console.log("Encoded string2", btoa(atob(string2)))