Base64S
# Algorithm
Encrypting
1. Calculate the difference in length of byte array len(key) - len(src). If the result is a negative value, it is treated as 0.2. XOR the source and key byte arrays in order and stores into a newly-allocated byte array.
3. Stores the result of (1) in the last byte.
4. Encode the byte array of (3) into a newly-allocated byte array using the Base64 encoding scheme.
Decrypting
Manipulate in the opposite way.# Examples
Normal Base64
Source Text (UTF-8) | a | b | c | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Source octets | 97 (0x61) | 98 (0x62) | 99 (0x63) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
Index | 24 | 22 | 9 | 35 | ||||||||||||||||||||
Base64-encoded | Y | W | J | j | ||||||||||||||||||||
Encoded octets | 89 (0x59) 01011001 |
87 (0x57) 01010111 |
74 (0x4A) 01001010 |
106 (0x6A) 01101010 |
Base64S : src = abc / key = xyz (src.length = key.length)
Source | Text (UTF-8) | a | b | c | |||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octets | 97 (0x61) | 98 (0x62) | 99 (0x63) | ||||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | |||||||||||||||||||||||||
Key | Text (UTF-8) | x | y | z | |||||||||||||||||||||||||||||||||||||||||||||
Octets | 120 (0x78) | 121 (0x79) | 122 (0x7A) | ||||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | |||||||||||||||||||||||||
Bitwise op. | 97 XOR 120 = 25 | 97 XOR 121 = 24 | 99 XOR 122 = 25 | key.len - src.len | |||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||
Output | Index | 6 | 17 | 44 | 25 | 0 | 0 | Padding | Padding | ||||||||||||||||||||||||||||||||||||||||
Base64-encoded | G | R | s | Z | A | A | = | = | |||||||||||||||||||||||||||||||||||||||||
Encoded octets | 71 (0x47) 01000111 |
82 (0x52) 01010010 |
115 (0x73) 01110011S |
90 (0x5A) 01011010 |
65 (0x41) 01000001 |
65 (0x41) 01000001 |
61 (0x3D) 00111101 |
61 (0x3D) 00111101 |
Base64S : src = abcde / key = xyz (src.length > key.length)
Source | Text (UTF-8) | a | b | c | d | e | |||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octets | 97 (0x61) | 98 (0x62) | 99 (0x63) | 100 (0x64) | 101 (0x65) | ||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | |||||||||
Key | Text (UTF-8) | x | y | z | x | y | |||||||||||||||||||||||||||||||||||||||||||
Octets | 120 (0x78) | 121 (0x79) | 122 (0x7A) | 120 (0x78) | 121 (0x79) | ||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | |||||||||
Bitwise op. | 97 XOR 120 = 25 | 97 XOR 121 = 24 | 99 XOR 122 = 25 | 100 XOR 120 = 28 | 101 XOR 121 = 28 | key.len - src.len | |||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Output | Index | 6 | 17 | 44 | 25 | 7 | 1 | 48 | 0 | ||||||||||||||||||||||||||||||||||||||||
Base64-encoded | G | R | s | Z | H | B | w | A | |||||||||||||||||||||||||||||||||||||||||
Encoded octets | 71 (0x47) 01000111 |
82 (0x52) 01010010 |
115 (0x73) 01110011 |
90 (0x5A) 01011010 |
72 (0x48) 01001000 |
66 (0x42) 01000010 |
119 (0x77) 01110111 |
65 (0x41) 01000001 |
Base64S : src = ab / key = xyz (src.length < key.length)
Source | Text (UTF-8) | a | b | Padding bits | |||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octets | 97 (0x61) | 98 (0x62) | |||||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||||||
Key | Text (UTF-8) | x | y | z | |||||||||||||||||||||||||||||||||||||||||||||
Octets | 120 (0x78) | 121 (0x79) | 122 (0x7A) | ||||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | |||||||||||||||||||||||||
Bitwise op. | 97 XOR 120 = 25 | 97 XOR 121 = 24 | 255 XOR 122 = 133 | len(key) - len(src) | |||||||||||||||||||||||||||||||||||||||||||||
Bit pattern | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | |||||||||||||
Output | Index | 6 | 17 | 46 | 5 | 0 | 16 | Padding | Padding | ||||||||||||||||||||||||||||||||||||||||
Base64-encoded | G | R | u | F | A | Q | = | = | |||||||||||||||||||||||||||||||||||||||||
Encoded octets | 71 (0x47) 01000111 |
82 (0x52) 01010010 |
117 (0x75) 01000110 |
70 (0x46) 01000110 |
65 (0x41) 01000001 |
81 (0x51) 01010001 |
61 (0x3D) 00111101 |
61 (0x3D) 00111101 |
# Implementation
Java, JavaScript, Python, PowerShell, VBA implementations are available on GitHub.Apache Maven
JAR direct download
base64s-1.1.1.jar (4,050 bytes / Compiled with JDK8)
SHA-1: 335e423f284cda1ba95cdb9a860c28776708e001
SHA-256: 306cdf48b74afa30462eecd6abc84f6b0c6625a6aa1fa8cbc0d224f24dc4cd6d