BASE64
-
编码对象: ascill字符
-
原理:
-
将每个字符的8位ascill码组合在一起,保证组合后的长度是24的倍数,不足的在后面添0
-
将组合好的字符串以6位一组拆分
-
将六位二进制转为十进制,并查字符表
数值 字符 数值 字符 数值 字符 数值 字符 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2 7 H 23 X 39 n 55 3 8 I 24 Y 40 o 56 4 9 J 25 Z 41 p 57 5 10 K 26 a 42 q 58 6 11 L 27 b 43 r 59 7 12 M 28 c 44 s 60 8 13 N 29 d 45 t 61 9 14 O 30 e 46 u 62 + 15 P 31 f 47 v 63 / -
注意,最后面的数为0的不需要查表,替换为"="
-
举例:
- 编码: ab
- 转为ascill码: 01100001 01100010
- 长度为12,不是24的倍数,补0 : 01100001 01100010 00000000
- 分组: 011000 010110 001000 000000
- 转为10进制: 24 22 8 0
- 最后有一个0,替换为"+", 其余查表: Y W I =
- 所以ab编码后的密文为: YWI=
-
代码
# write in 2021/6/21 import re DIC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" def is_ascii(char): if ord(char) >= 0 and ord(char) <= 127: return True return False def encrypt_base64(string): bin_string = "" ciphertext = "" num = 0 length = len(string) for char in string: # 异常检测 if not is_ascii(char): return -1 bin_string += ("00000000" + str(bin(ord(char)))[2::])[-8::] #print(length) if length % 3 == 1: bin_string += "0"*4 num = 2 elif length % 3 == 2: bin_string += "0"*8 num = 1 bin_list = re.findall(".{6}",bin_string) for i in bin_list: ciphertext += DIC[int(i,2)] return ciphertext + "="*num def decrypt_base64(ciphertext): plaintext = "" bin_string = "" print(ciphertext) num = ciphertext.count("=") #print(num) if num: ciphertext = ciphertext[0:-num:] #print(ciphertext) for i in ciphertext: # 异常检测 if i not in DIC: return -1 bin_string += ("0"*6 + str(bin(DIC.index(i)))[2::])[-6::] bin_list = re.findall(".{8}", bin_string) print(bin_list) for i in bin_list: plaintext += chr(int(i, 2)) return plaintext # 01000000 if __name__ == '__main__': print("Aabc ",encrypt_base64("Aabc")) print("Aabc ",decrypt_base64(encrypt_base64("Aabc")))
-
BASE32
-
编码对象: ascill字符
-
原理:
-
将每个字符转为8位ascill码,组合在一起,需要保证长度是40的倍数, 不足的在后面补0
-
将组合后的串以每五位分割开来
-
将五位的二进制转为十进制,在查表:
数值 字符 数值 字符 数值 字符 数值 字符 0 A 8 I 16 Q 24 Y 1 B 9 j 17 R 25 Z 2 C 10 K 18 S 26 2 3 D 11 L 19 T 27 3 4 E 12 M 20 U 28 4 5 F 13 N 21 V 29 5 6 G 14 O 22 W 30 6 7 H 15 P 23 X 31 7 -
注意:最后的0不需要查表, 替换为"="
-
代码
# write in 2021/6/22 import re DIC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" def is_ascii(char): if ord(char) >= 0 and ord(char) <= 127: return True return False def encrypt_base32(string): bin_string = "" ciphertext = "" num = 0 length = len(string) for char in string: # 异常检测 if not is_ascii(char): return -1 bin_string += ("00000000" + str(bin(ord(char)))[2::])[-8::] #print(length) if length % 5 == 1: bin_string += "0"*2 num = 6 elif length % 5 == 2: bin_string += "0"*4 num = 4 elif length % 5 == 3: bin_string += "0" num = 3 elif length % 5 == 4: bin_string += "0"*3 num = 1 bin_list = re.findall(".{5}",bin_string) print(bin_list) for i in bin_list: ciphertext += DIC[int(i,2)] return ciphertext + "="*num def decrypt_base32(ciphertext): plaintext = "" bin_string = "" #print(ciphertext) num = ciphertext.count("=") print(num) if num: ciphertext = ciphertext[0:-num:] #print(ciphertext) for i in ciphertext: # 异常检测 if i not in DIC: return -1 bin_string += ("0"*5 + str(bin(DIC.index(i)))[2::])[-5::] bin_list = re.findall(".{8}",bin_string) for i in bin_list: plaintext += chr(int(i,2)) return plaintext if __name__ == '__main__': print("Aabc ",encrypt_base32("Aabc")) print("Aabc ",decrypt_base32(encrypt_base32("Aabc")))
-
BASE16
-
编码对象: ascill字符
-
原理:
-
将字符转为8位ascill码,并组合在一起
-
将字符以每4位一组分割
-
将4位二进制转为十进制
-
查表:
数值 字符 数值 字符 数值 字符 数值 字符 0 0 4 4 8 8 12 c 1 1 5 5 9 9 13 d 2 2 6 6 10 a 14 e 3 3 7 7 11 b 15 f -
代码
# write in 2021/6/22 import re DIC = "0123456789ABCDEF" def is_ascii(char): if ord(char) >= 0 and ord(char) <= 127: return True return False def encrypt_base16(string): bin_string = "" ciphertext = "" length = len(string) for char in string: # 异常检测 if not is_ascii(char): return -1 bin_string += ("00000000" + str(bin(ord(char)))[2::])[-8::] #print(length) bin_list = re.findall(".{4}",bin_string) print(bin_list) for i in bin_list: ciphertext += DIC[int(i,2)] return ciphertext def decrypt_base16(ciphertext): plaintext = "" bin_string = "" #print(ciphertext) for i in ciphertext: # 异常检测 if i not in DIC: return -1 bin_string += ("0"*4 + str(bin(DIC.index(i)))[2::])[-4::] bin_list = re.findall(".{8}",bin_string) for i in bin_list: plaintext += chr(int(i,2)) return plaintext if __name__ == '__main__': print("Aabc ",decrypt_base16("Aabc")) print("Aabc ",decrypt_base16(encrypt_base16("Aabc")))
-