Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

base64 encode & decode questions where a != b

Tags:

python

base64

Given this example in Python

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB===='
a = base64.b32decode(sample)
b = base64.b32encode(a)

why is it that

sample != b ?

BUT where

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'

then

sample == b

like image 771
Ernest Avatar asked Jul 22 '26 07:07

Ernest


2 Answers

the first sample you got there is invalid base64.

taken from wiki:

When the number of bytes to encode is not divisible by 3 (that is, if there are only one or two bytes of input for the last block), then the following action is performed: Add extra bytes with value zero so there are three bytes, and perform the conversion to base64. If there was only one significant input byte, only the first two base64 digits are picked, and if there were two significant input bytes, the first three base64 digits are picked. '=' characters might be added to make the last block contain four base64 characters.

http://en.wikipedia.org/wiki/Base64#Examples

edit:

taken from RFC 4648:

Special processing is performed if fewer than 24 bits are available
at the end of the data being encoded. A full encoding quantum is
always completed at the end of a quantity. When fewer than 24 input
bits are available in an input group, bits with value zero are added
(on the right) to form an integral number of 6-bit groups. Padding
at the end of the data is performed using the '=' character.

4 times 8bits (the ='s) (at the end of your sample) is more than 24bits so they are at the least unneccessary. (not sure what datatype sample is, but find out and take it's size times number of characters divided by 24)

about your particular sample:

base-encoding reads in 24bit chunks and only needs '=' padding characters at the end of the base'd string to make whatever was left of the string after splitting it into 24bit chunks be "of size 24" so it can be parsed by the decoder. since the ===='s at the end of your string amount to more than 24bits they are useless, hence: invalid...

like image 146
Gung Foo Avatar answered Jul 24 '26 21:07

Gung Foo


First, let's be clear: your question is about base32, not base64.

Your original sample is a bit too long. There are 4 = padding at the end, meaning at least 20 bits of padding. The number of bits must be a multiple of 8 so it's really 24 bits. The encoding for B in base32 is 1, which means one of the padding bits is set. This is a violation of the spec, which says all the padding bits must be clear. The decode drops the bit completely, and the encode produces the proper value A instead of B.

like image 23
Mark Ransom Avatar answered Jul 24 '26 21:07

Mark Ransom