请先安装这几个模块
# Python 3.11.0 import hashlib import binascii import google_crc32c import zlib import base64 import urllib.parse import opencc import time from Crypto.Cipher import AES # 安装方法如下 # 打开cmd 输入如下代码回车即可 pip install hashlib pip install binascii pip install google_crc32c pip install zlib pip install base64 pip install urllib.parse pip install opencc # 安装 Crypto.Cipher pip install pycryptodome
一、加密(不含解密)
1、MD4
import hashlib def md4_encrypt(string): md4 = hashlib.new('md4') md4.update(string.encode('utf-8')) return md4.hexdigest() # 输入 print(md4_encrypt("你好")) # 输出:a7f1196539fd1f85f754ffd185b16e6e
2、MD5
import hashlib def md5_encrypt(string): md5 = hashlib.md5() md5.update(string.encode('utf-8')) return md5.hexdigest() # 输入 print(md5_encrypt("你好")) # 输出:7eca689f0d3389d9dea66ae112e5cfd7
3、blake2b
import hashlib def blake2b_encrypt(string): blake2b = hashlib.blake2b() blake2b.update(string.encode('utf-8')) return blake2b.hexdigest() # 输入 print(blake2b_encrypt("你好")) # 输出:8eadb63a9f823c4e8eac400247995c69ab714dd54cc33bbf0583e269e3aa9077ad8c0069ffb2fec634a1dd913196c0e459f987a1e5d3c9997e9fd556b38604a4
4、blake2s
import hashlib def blake2s_encrypt(string): blake2s = hashlib.blake2s() blake2s.update(string.encode('utf-8')) return blake2s.hexdigest() # 输入 print(blake2s_encrypt("你好")) # 输出:b834cce099cfa370b999ebfa3bb8a6a87fa09b45a1a83d038d8957cbb88c9896
5、SHA1
import hashlib def sha1_encrypt(string): sha1 = hashlib.sha1() sha1.update(string.encode('utf-8')) return sha1.hexdigest() # 输入 print(sha1_encrypt("你好")) # 输出:440ee0853ad1e99f962b63e459ef992d7c211722
6、SHA224
import hashlib def sha224_encrypt(string): sha224 = hashlib.sha224() sha224.update(string.encode('utf-8')) return sha224.hexdigest() # 输入 print(sha224_encrypt("你好")) # 输出:e91f006ed4e0882de2f6a3c96ec228a6a5c715f356d00091bce842b5
7、SHA256
import hashlib def sha256_encrypt(string): sha256 = hashlib.sha256() sha256.update(string.encode('utf-8')) return sha256.hexdigest() # 输入 print(sha256_encrypt("你好")) # 输出:670d9743542cae3ea7ebe36af56bd53648b0a1126162e78d81a32934a711302e
8、SHA384
import hashlib def sha384_encrypt(string): sha384 = hashlib.sha384() sha384.update(string.encode('utf-8')) return sha384.hexdigest() # 输入 print(sha384_encrypt("你好")) # 输出:05f076c7d180e91d80a56d70b226fca01e2353554c315ac1e8caaaeca2ce0dc0d9d84e206a2bf1143a0ae1b9be9bcfa8
9、SHA512
import hashlib def sha512_encrypt(string): sha512 = hashlib.sha512() sha512.update(string.encode('utf-8')) return sha512.hexdigest() # 输入 print(sha512_encrypt("你好")) # 输出:5232181bc0d9888f5c9746e410b4740eb461706ba5dacfbc93587cecfc8d068bac7737e92870d6745b11a25e9cd78b55f4ffc706f73cfcae5345f1b53fb8f6b5
10、SHA3_224
import hashlib def sha3_224_encrypt(string): sha3_224 = hashlib.sha3_224() sha3_224.update(string.encode('utf-8')) return sha3_224.hexdigest() # 输入 print(sha3_224_encrypt("你好")) # 输出:d6e2200b43a6997075692b6dde5ca9f91cae1d15f72546d3c9a9d8c4
11、SHA3_256
import hashlib def sha3_256_encrypt(string): sha3_256 = hashlib.sha3_256() sha3_256.update(string.encode('utf-8')) return sha3_256.hexdigest() # 输入 print(sha3_224_encrypt("你好")) # 输出:0100e69a7157f3a814a3cf6895f4fccd6b610b9947224b2aaa7aa11dd0dca833
12、SHA3_384
import hashlib def sha3_384_encrypt(string): sha3_384 = hashlib.sha3_384() sha3_384.update(string.encode('utf-8')) return sha3_384.hexdigest() # 输入 print(sha3_384_encrypt("你好")) # 输出:bdc0b2e622a1d79abae4cabbf86bd88192dead3b90c8332ac4bac08e9a2c06d5c685f46101ac0c14980849f39a7b0ebf
13、SHA3_512
import hashlib def sha3_512_encrypt(string): sha3_512 = hashlib.sha3_512() sha3_512.update(string.encode('utf-8')) return sha3_512.hexdigest() # 输入 print(sha3_512_encrypt("你好")) # 输出:d673e4b36755b938359fa394cf920b4430a34f447ea5cb10485d9d46a7d6682eef6d7459b4dac9019d908e08a1e7aaab3accde4f59e862dbb99f906d85e5c66d
14、shake_128
import hashlib def shake_128_encrypt(data): data = data.encode('utf-8') shake_128 = hashlib.shake_128() shake_128.update(data) return shake_128.hexdigest(32) # 输入 print(shake_128_encrypt("你好")) # 输出:2c8206e6e29e0e3c9d64e9455629cd354548a15761d3bafcb941769ed4649538
15、shake_256
import hashlib def shake_256_encrypt(data): data = data.encode('utf-8') shake_256 = hashlib.shake_256() shake_256.update(data) return shake_256.hexdigest(32) # 输入 print(shake_256_encrypt("你好")) # 输出:d13a972c4c06e0cbb67af0af4b1a92d296b709e36cccbeed30db6c9d2853cd1c
16、crc32 十进制
import binascii def crc32_10(data): return binascii.crc32(data.encode()) & 0xffffffff # 输入 print(crc32_10("你好")) # 输出:1352841281
17、crc32 十六进制
import binascii def crc32_16(data): return hex(binascii.crc32(data.encode()) & 0xffffffff) # 输入 print(crc32_16("你好")) # 输出:0x50a2b841
18、CRC32C十进制
import google_crc32c def crc32c_10(data): return google_crc32c.value(data.encode()) # 输入 print(crc32c_10("你好")) # 输出:1383944972
19、CRC32C十六进制
import google_crc32c def crc32c_16(data): return hex(google_crc32c.value(data.encode())) # 输入 print(crc32c_16("你好")) # 输出:0x527d530c
20、Adler32十进制
import zlib def adler32_10(data): return zlib.adler32(data.encode()) & 0xffffffff # 输入 print(adler32_10("你好")) # 输出:272958601
21、Adler32十六进制
import zlib def adler32_16(data): return hex(zlib.adler32(data.encode()) & 0xffffffff) # 输入 print(adler32_16("你好")) # 输出:0x10450489
二、加密&解密
1、IDEA 加密解密
# IDEA【加密算法】 def IDEA_encrypt(string, key): # string要加密的字符串 key只能为数字,5位数内 result = '' for i in range(len(string)): result += chr(ord(string[i]) + int(key)) return result # 输入 print(IDEA_encrypt("你好",443322)) # 输出: # IDEA【解密算法】 def IDEA_decrypt(string, key): # string要加密的字符串 key只能为数字,5位数内 result = '' for i in range(len(string)): result += chr(ord(string[i]) - int(key)) return result # 输入 print(IDEA_decrypt("",443322)) # 输出:你好
2、ASCLL 加密解密
# ASCLL【加密】 def decrypt_ASCLL(string): result = "" for char in string: result += chr(ord(char) + 1000) return result # 输入 print(decrypt_ASCLL('你好')) # 输出:午嵥 # ASCLL【解密】 def encrypt_ASCLL(string): result = "" for char in string: result += chr(ord(char) - 1000) return result # 输入 print(encrypt_ASCLL('午嵥')) # 输出:你好
3、AES_ECB 加密解密
# AES 【ECB加密】 # AES 【加密】 加密模式(不可改):ECB key(默认):0000000000000000 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_ECB_encode(data,key=b'0000000000000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' # 检测密钥的长度是否是16或32字节长度 if len(key) in [16,32]: data = data.encode(characterSet) AESS = AES.new(key, AES.MODE_ECB) enData = '' if paddingMode == 'NoPadding': if len(data) % 16 == 0: enData = AESS.encrypt(data) # AES加密 else: if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode == 'ZeroPadding': if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode in ['PKCS5Padding','PKCS7Padding']: needSize = 16 - len(data) % 16 if needSize == 0: needSize = 16 data = data + needSize.to_bytes(1, 'little') * needSize enData = AESS.encrypt(data) # AES加密 return base64.b64encode(enData).decode() else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_ECB_encode('你好 Abc',key=b'1234567890123456',paddingMode='PKCS5Padding')) # 输出:3ZJEr/p5lexy81r+IRGGoQ==
# AES 【ECB解密】 # AES 【解密】 加密模式(不可改):ECB key(默认):0000000000000000 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_ECB_decode(data,key=b'0000000000000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' if len(key) in [16, 32]: data = base64.b64decode(data.encode(characterSet)) data = AES.new(key, AES.MODE_ECB).decrypt(data) if paddingMode in ['NoPadding','ZeroPadding']: data = data[:-1] while len(data) % 16 != 0: data = data.rstrip(b'\x00') if data[-1] != b"\x00": break if paddingMode in ['PKCS5Padding','PKCS7Padding']: paddingSize = data[-1] data = data.rstrip(paddingSize.to_bytes(1, 'little')) return data.decode(characterSet) else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_ECB_decode('3ZJEr/p5lexy81r+IRGGoQ==',key=b'1234567890123456',paddingMode='PKCS5Padding')) # 输出:你好 Abc
4、AES_CBC 加密解密
# AES 【CBC加密】 # AES 【加密】 加密模式(不可改):CBC key/iv(默认):0000000000000000 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_CBC_encode(data,key=b'0000000000000000',iv=b'0000000000000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # iv:偏移量,长度为16字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' # 检测密钥的长度是否是16或32字节长度,iv偏移量的字节长度是否是16字节 if (len(key) in [16,32]) and (len(iv) in [16]) == True: data = data.encode(characterSet) AESS = AES.new(key, AES.MODE_CBC, iv) enData = '' if paddingMode == 'NoPadding': if len(data) % 16 == 0: enData = AESS.encrypt(data) # AES加密 else: if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode == 'ZeroPadding': if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode in ['PKCS5Padding','PKCS7Padding']: needSize = 16 - len(data) % 16 if needSize == 0: needSize = 16 data = data + needSize.to_bytes(1, 'little') * needSize enData = AESS.encrypt(data) # AES加密 return base64.b64encode(enData).decode() else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_CBC_encode('你好 Abc',key=b'1234567890123456',paddingMode='PKCS5Padding')) # 输出:VzrFG9/TsFTW+yup4/tr4g==
# AES 【CBC解密】 # AES 【解密】 加密模式(不可改):CBC key/iv(默认):0000000000000000 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_CBC_decode(data,key=b'0000000000000000',iv=b'0000000000000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # iv:偏移量,长度为16字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' if (len(key) in [16, 32]) and (len(iv) in [16]) == True: data = base64.b64decode(data.encode(characterSet)) data = AES.new(key, AES.MODE_CBC, iv).decrypt(data) if paddingMode in ['NoPadding','ZeroPadding']: data = data[:-1] while len(data) % 16 != 0: data = data.rstrip(b'\x00') if data[-1] != b"\x00": break if paddingMode in ['PKCS5Padding','PKCS7Padding']: paddingSize = data[-1] data = data.rstrip(paddingSize.to_bytes(1, 'little')) return data.decode(characterSet) else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_CBC_decode('VzrFG9/TsFTW+yup4/tr4g==',key=b'1234567890123456',paddingMode='PKCS5Padding')) # 输出:你好 Abc
5、AES_CFB 加密解密
# AES 【CFB加密】 # AES 【加密】 加密模式(不可改):CFB key/iv(默认):0000000000000000 块大小(bits)(默认):16 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_CFB_encode(data,key=b'0000000000000000',iv=b'0000000000000000',segment_size=16,paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # iv:偏移量,长度为16字节 # segment_size:块大小(bits) 默认为 8 最小值为 8 最大值为128 只能是8的倍数,如:8,16,24,32,40,48,56,64... # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' # 检测密钥的长度是否是16或32字节长度 if (len(key) in [16,32]) and (len(iv) in [16]) == True: data = data.encode(characterSet) AESS = AES.new(key, AES.MODE_CFB,iv,segment_size=segment_size) enData = '' if paddingMode == 'NoPadding': if len(data) % 2 == 0: enData = AESS.encrypt(data) # AES加密 else: if len(data) % 2 != 0: data += b'\x00' while len(data) % 2 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode == 'ZeroPadding': if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = AESS.encrypt(data) # AES加密 if paddingMode in ['PKCS5Padding','PKCS7Padding']: needSize = 16 - len(data) % 16 if needSize == 0: needSize = 16 data = data + needSize.to_bytes(1, 'little') * needSize enData = AESS.encrypt(data) # AES加密 return base64.b64encode(enData).decode() else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_CFB_encode('你好 Abc',key=b'1234567890123456',iv=b'1111111111111111',paddingMode='NoPadding')) # 输出:QiLUCMq9uwxjUw==
# AES 【CFB解密】 # AES 【解密】 加密模式(不可改):CFB key/iv(默认):0000000000000000 块大小(bits)(默认):16 填充模式(默认):NoPadding 子集编码(默认):UTF-8 字节(不可改):128字节 from Crypto.Cipher import AES import base64 def AES_CFB_decode(data,key=b'0000000000000000',iv=b'0000000000000000',segment_size=16,paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为16字节或32字节 # iv:偏移量,长度为16字节 # segment_size:块大小(bits) 默认为 8 最小值为 8 最大值为128 只能是8的倍数,如:8,16,24,32,40,48,56,64... # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' if (len(key) in [16,32]) and (len(iv) in [16]) == True: data = base64.b64decode(data.encode(characterSet)) data = AES.new(key, AES.MODE_CFB,iv,segment_size=segment_size).decrypt(data) if paddingMode in ['NoPadding']: while len(data) % 2 != 0: data = data.rstrip(b'\x00') if data != b"\x00": break if paddingMode in ['ZeroPadding']: data = data[:-1] while len(data) % 16 != 0: data = data.rstrip(b'\x00') if data[-1] != b"\x00": break if paddingMode in ['PKCS5Padding','PKCS7Padding']: paddingSize = data[-1] data = data.rstrip(paddingSize.to_bytes(1, 'little')) return data.decode(characterSet) else: return '密钥或iv字节长度错误!!!' # 输入 print(AES_CFB_decode('QiLUCMq9uwxjUw==',key=b'1234567890123456',iv=b'1111111111111111',paddingMode='NoPadding')) # 输出:你好 Abc
6、DES_CBC 加密解密
# DES 【CBC加密】 # DES 【加密】 加密模式(不可改):CBC key/iv(默认):00000000 块大小(bits)(默认):16 填充模式(默认):NoPadding 子集编码(默认):UTF-8 from Crypto.Cipher import DES import base64 def DES_CBC_encode(data,key=b'00000000',iv=b'00000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为8字节 # iv:偏移量,长度为8字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' if [(len(key)),len(iv)] == [8,8]: DESS = DES.new(key, DES.MODE_CBC,iv) data = data.encode(characterSet) enData = '' if paddingMode in ['NoPadding','ZeroPadding']: if len(data) % 16 != 0: data += b'\x00' while len(data) % 16 != 0: data += b'\x00' data = data enData = DESS.encrypt(data) # DES加密 if paddingMode in ['PKCS5Padding','PKCS7Padding']: needSize = 16 - len(data) % 16 if needSize == 0: needSize = 16 data = data + needSize.to_bytes(1, 'little') * needSize enData = DESS.encrypt(data) # DES加密 return base64.b64encode(enData).decode() else: return '密钥或iv字节长度错误!!!' # 输入 print(DES_CBC_encode('你好 Abc',key=b'12345678',iv=b'88888888',paddingMode='ZeroPadding')) # 输出:4jaMYjQEe5FW1JJyDhCliQ==
# DES 【CBC解密】 # DES 【解密】 加密模式(不可改):CBC key/iv(默认):00000000 块大小(bits)(默认):16 填充模式(默认):NoPadding 子集编码(默认):UTF-8 from Crypto.Cipher import DES import base64 def DES_CBC_decode(data,key=b'00000000',iv=b'00000000',paddingMode='NoPadding',characterSet='UTF-8'): ''' # data:加解密内容【解密】 # key:密钥,长度为8字节 # iv:偏移量,长度为8字节 # paddingMode:填充模式,默认为NoPadding 可选【NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding】 # characterSet:编码,默认为UTF-8 可选【UTF-8,UTF-16_LE,GBK】 ''' if [(len(key)),len(iv)] == [8,8]: data = base64.b64decode(data.encode(characterSet)) data = DES.new(key, DES.MODE_CBC, iv).decrypt(data) if paddingMode in ['NoPadding','ZeroPadding']: data = data[:-1] while len(data) % 16 != 0: data = data.rstrip(b'\x00') if data[-1] != b"\x00": break if paddingMode in ['PKCS5Padding', 'PKCS7Padding']: paddingSize = data[-1] data = data.rstrip(paddingSize.to_bytes(1, 'little')) return data.decode(characterSet) else: return '密钥或iv字节长度错误!!!' # 输入 print(DES_CBC_decode('4jaMYjQEe5FW1JJyDhCliQ==',key=b'12345678',iv=b'88888888',paddingMode='ZeroPadding')) # 输出:你好 Abc
三、编码&解码
1、base64 编码解码(文字)
# base64 【编码】 import base64 def base64_encode(str): return base64.b64encode(str.encode('utf-8')).decode('utf-8') # 输入 print(base64_encode("你好")) # 输出:5L2g5aW9
# base64 【解码】 import base64 def base64_decode(str): return base64.b64decode(str).decode('utf-8') # 输入 print(base64_decode("5L2g5aW9")) # 输出:你好
2、base64 编码解码(文件)
# base64 【编码】 import base64 def base64_encode_file(file_name): with open(file_name, 'rb') as f: return base64.b64encode(f.read()).decode('utf-8') # 输入 print(base64_encode_file("1.txt")) # 输出:/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMbaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjEtYzAwMCA3OS5jY2Y4NGUwLCAyMDIyLzA2LzIyLTIyOjEzOjI2ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQjkzRDc0NDhENzExMUVEODI5QkFGQTc4NzM0QjcxRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQjkzRDc0MzhENzExMUVEODI5QkFGQTc4NzM0QjcxRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjAyMSBXaW5kb3dzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9IjJFQ0Y3OEY5OEY3MjIxRUMzREU3ODE0MDQyMDNCMjM1IiBzdFJlZjpkb2N1bWVudElEPSIyRUNGNzhGOThGNzIyMUVDM0RFNzgxNDA0MjAzQjIzNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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
# base64 【解码】 import base64 def base64_decode_file(base64_data): img_data = base64.b64decode(base64_data) with open('1.jpg', 'wb') as f: f.write(img_data) # 输入 base64_decode_file("/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMbaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjEtYzAwMCA3OS5jY2Y4NGUwLCAyMDIyLzA2LzIyLTIyOjEzOjI2ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQjkzRDc0NDhENzExMUVEODI5QkFGQTc4NzM0QjcxRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQjkzRDc0MzhENzExMUVEODI5QkFGQTc4NzM0QjcxRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjAyMSBXaW5kb3dzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9IjJFQ0Y3OEY5OEY3MjIxRUMzREU3ODE0MDQyMDNCMjM1IiBzdFJlZjpkb2N1bWVudElEPSIyRUNGNzhGOThGNzIyMUVDM0RFNzgxNDA0MjAzQjIzNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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") # 输出:(是一个jpg图片文件)
3、ASCLL码 编码解码
# ASCLL【编码】 def ASCLL_encode(string): result = [] for a in string: result = result + [ord(a)] return result # 输入 print(ASCLL_encode('你好')) # 输出(列表):[20320, 22909]
# ASCLL【解码】 def ASCLL_decode(string): result = "" for a in eval(string): result = result + chr(a) return result # 输入(列表) print(ASCLL_decode('[20320, 22909]')) # 输出:你好
4、Unicode编码解码
# Unicode 【编码】 (仅对中文有效) def str_to_unicode(str_data): return str_data.encode('unicode_escape').decode('utf-8') # 输入 print(str_to_unicode('你好')) # 输出:\u4f60\u597d
# Unicode 【解码】 def unicode_to_str(unicode_str): return unicode_str # 输入 print(unicode_to_str('\u4f60\u597d')) # 输出:你好
5、UTF-8编码解码
# UTF-8 【编码】 def utf8_encode(str_data): return str_data.encode('utf-8') # 输入 print(utf8_encode('你好')) # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'
# UTF-8 【解码】 # 输入 print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')) # 输出:你好
6、URL 编码解码
# 方法一 # URL 【编码】 (仅对中文有效) import urllib.parse def URL_encode(url): return urllib.parse.quote(url) # 输入 print(URL_encode('你好')) # 输出:%E4%BD%A0%E5%A5%BD
# 方法二 # URL 【编码】 (对所有字符串有效) def URL_encode(url): return ''.join([hex(ord(c)).replace('0x', '%') for c in url]) # 输入 print(URL_encode('http://www.baidu.com')) # 输出:%68%74%74%70%3a%2f%2f%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d
# URL 【解码】 import urllib.parse def URL_decode(url): return urllib.parse.unquote(url) # 输入 print(URL_decode('%E4%BD%A0%E5%A5%BD')) # 输出:你好
7、摩斯密码 编码解码
# 摩斯密码字典 【必备 必须添加】(后续会更新更多) # 摩斯密码会把正常的英文都统一为大写,输出会变为大写 # !!!!加解密有限制,只能对 【英文和数字】 进行加解密。字典需更新 MORSE_CODE_DICT = { 'A':'.-','B':'-...','C':'-.-.','D':'-..', 'E':'.','F':'..-.','G':'--.','H':'....', 'I':'..', 'J':'.---', 'K':'-.-', 'L':'.-..', 'M':'--', 'N':'-.','O':'---', 'P':'.--.', 'Q':'--.-', 'R':'.-.', 'S':'...', 'T':'-', 'U':'..-', 'V':'...-', 'W':'.--', 'X':'-..-', 'Y':'-.--', 'Z':'--..', '1':'.----', '2':'..---', '3':'...--', '4':'....-', '5':'.....', '6':'-....', '7':'--...', '8':'---..', '9':'----.', '0':'-----', ', ':'--..--', '.':'.-.-.-', '?':'..--..', '/':'-..-.', '-':'-....-', '(':'-.--.', ')':'-.--.-',' ':' '}
# 摩斯密码【加密】 (通用版) 与互联网上的相匹配,可以通用,前提是字典要齐全 # 这个加密包不含空格,原本含有空格的字符串会被替换为无(不含空格的加密) def morse_encode(message): cipher = '' set = 0 for letter in message.replace(' ','').upper(): if set == 1: cipher += '/' if letter != ' ': cipher += MORSE_CODE_DICT[letter] set = 1 return cipher # 输入 print(morse_encode('abc')) # 输出:.-/-.../-.-.
# 摩斯密码【解密】 (通用版) 与互联网上的相匹配,可以通用,前提是字典要齐全 # (不含空格的解密) def decode_morse_code(code): code = code.replace('/',' ') # 将摩斯密码字符串按空格分割 code_list = code.split(' ') # 定义解密后的字符串 decode_str = '' # 遍历摩斯密码字符串列表 for code_str in code_list: # 将摩斯密码字符串从字典中取出对应的字符 decode_str += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(code_str)] # 返回解密后的字符串 return decode_str # 输入 print(decode_morse_code('.-/-.../-.-.')) # 输出:ABC
# 摩斯密码【加密】 (修改版 私用) 加密后的摩斯密码只能通过下面的那个脚本进行解密 # 这个加密包含空格,原本含有空格的字符串都会加密(加密含空格) def morses_encode(message): cipher = '' set = 0 for letter in message.upper(): if set != 0: cipher += '/' if letter != ' ': cipher += MORSE_CODE_DICT[letter] set += 1 else: set = 0 cipher += '&/' return cipher # 输入 print(morses_encode('ab c')) # 输出:.-/-.../&/-.-.
# 摩斯密码【解密】 (修改版 私用) 也可以用于互联网的加解密,可以通用,前提是字典要齐全 # (解密含空格)可通用 def decodes_morse_code(code): code = code.replace('/',' ') # 将摩斯密码字符串按空格分割 code_list = code.split(' ') # 定义解密后的字符串 decode_str = '' # 遍历摩斯密码字符串列表 for code_str in code_list: if code_str == '&': decode_str += ' ' else: # 将摩斯密码字符串从字典中取出对应的字符 decode_str += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(code_str)] # 返回解密后的字符串 return decode_str # 输入 print(decodes_morse_code('.-/-.../&/-.-.')) # 输出:AB C
8、hexstr 编码解码
# hexstr 【编码】 import binascii def hexstr_encode(data): return binascii.b2a_hex(data.encode()).decode() # 输入 print(hexstr_encode('你好')) # 输出:e4bda0e5a5bd
# hexstr 【解码】 import binascii def encode_hexstr(data): return binascii.a2b_hex(data).decode() # 输入 print(encode_hexstr('e4bda0e5a5bd')) # 输出:你好
四、字符串转换
1、中文&繁体
# 简体转繁体 import opencc def convert_opencc(text): return opencc.OpenCC('s2t').convert(text) # 输入 print(convert_opencc('线类')) # 输出:線類
# 繁体转简体 import opencc def opencc_convert(text): return opencc.OpenCC('t2s').convert(text) # 输入 print(opencc_convert('線類')) # 输出:线类
2、字符串 大写&小写
# 字符串转大写 def exchange_upper(str): return str.upper() # 输入 print(exchange_upper('abc')) # 输出:ABC
# 字符串转小写 def exchange_lower(str): return str.lower() # 输入 print(exchange_lower('ABC')) # 输出:abc
3、字符串 全角&半角
# 半角转全角 def strB2Q(ustring): """半角转全角""" rstring = "" for uchar in ustring: inside_code=ord(uchar) if inside_code == 32: # 半角空格直接转化 inside_code = 12288 elif inside_code >= 32 and inside_code <= 126: # 半角字符(除空格)根据关系转化 inside_code += 65248 rstring += chr(inside_code) return rstring # 输入 print(strB2Q('123abc')) # 输出:123abc
# 全角转半角 def strQ2B(ustring): """全角转半角""" rstring = "" for uchar in ustring: inside_code = ord(uchar) if inside_code == 12288: # 全角空格直接转换 inside_code = 32 elif (inside_code >= 65281 and inside_code <= 65374): # 全角字符(除空格)根据关系转化 inside_code -= 65248 rstring += chr(inside_code) return rstring # 输入 print(strQ2B('123abc')) # 输出:123abc
4、时间戳 & 日期
# 日期转时间戳 import time def Unix_time(times): # 转换为时间戳,将"%Y-%m-%d %H:%M:%S"转换为 1672989181字符串 return int(time.mktime(time.strptime(times, '%Y-%m-%d %H:%M:%S'))) # 输入 print(Unix_time('2023-01-01 15:12:07')) # 输出:1672557127
# 时间戳转日期 import time def time_Unix(times): # 转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S" return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(times)) # 输入 print(time_Unix('1672557127')) # 输出:2023-01-01 15:12:07
5、颜色 HEX & RGB & CMYK
# HEX 转 RGB(元组) def hex_to_rgb(hex_color): hex_color = hex_color.lstrip('#') lv = len(hex_color) return tuple(int(hex_color[i:i + lv // 3], 16) for i in range(0, lv, lv // 3)) # 输入 print(hex_to_rgb('#FFFFFF')) # 输出(元组):(255, 255, 255)
# RGB(元组) 转 HEX def rgb_to_hex(rgb_color): return '#%02x%02x%02x' % rgb_color # 输入(元组) print(rgb_to_hex((255, 255, 255))) # 输出:#FFFFFF
# RGB(元组) 转 CMYK(元组) def rgb_to_cmyk(rgb): r = rgb[0] / 255.0 g = rgb[1] / 255.0 b = rgb[2] / 255.0 c = 1 - r m = 1 - g y = 1 - b k = min(c, m, y) c = (c - k) / (1 - k) m = (m - k) / (1 - k) y = (y - k) / (1 - k) cmyk = (c, m, y, k) return cmyk # 输入(元组) print(rgb_to_cmyk((198, 254, 234))) # 输出(元组):(0.2204724409448819, 0.0, 0.07874015748031502, 0.0039215686274509665)
# CMYK(元组) 转 RGB(元组) def cmyk_to_rgb(cmyk): c = cmyk[0] m = cmyk[1] y= cmyk[2] k = cmyk[3] r = int(255 * (1 - c) * (1 - k)) g = int(255 * (1 - m) * (1 - k)) b = int(255 * (1 - y) * (1 - k)) rgb = (r, g, b) return rgb # 输入(元组) print(cmyk_to_rgb((0.2204724409448819, 0.0, 0.07874015748031502, 0.0039215686274509665))) # 输出(元组):(198, 254, 234)
五、进制转换
1、【2进制】 转 4进制、8进制、10进制、16进制、32进制
# 2进制 转 4进制 def binary_to_quaternary(binary): # 将2进制转换为10进制 decimal = int(binary, 2) # 将10进制转换为4进制 quaternary = '' while decimal != 0: remainder = decimal % 4 decimal = decimal // 4 quaternary = str(remainder) + quaternary return quaternary # 输入 print(binary_to_quaternary('1101110110111')) # 输出:1232313
# 2进制 转 8进制 # 输入 print(oct(int('1101110110111',2))) # 2进制 转 8进制 # 输出:0o15667
# 2进制 转 10进制 # 输入 print(str(int('1101110110111',2))) # 2进制 转 10进制 # 输出:7095
# 2进制 转 16进制 # 输入 print(hex(int('1101110110111',2))) # 2进制 转 16进制 # 输出:0x1bb7
# 2进制 转 32进制 def binary_to_base32(binary): # 定义一个字典,用于存储2进制到32进制的映射关系 base32_dict = { '00000': '0', '00001': '1', '00010': '2', '00011': '3', '00100': '4', '00101': '5', '00110': '6', '00111': '7', '01000': '8', '01001': '9', '01010': 'A', '01011': 'B', '01100': 'C', '01101': 'D', '01110': 'E', '01111': 'F', '10000': 'G', '10001': 'H', '10010': 'I', '10011': 'J', '10100': 'K', '10101': 'L', '10110': 'M', '10111': 'N', '11000': 'O', '11001': 'P', '11010': 'Q', '11011': 'R', '11100': 'S', '11101': 'T', '11110': 'U', '11111': 'V' } binary = (5 - len(binary) % 5) * '0' + binary # 将2进制字符串转换为列表 binary_list = list(binary) # 将2进制列表转换为5位2进制字符串的列表 binary_list_5 = [binary_list[i:i+5] for i in range(0, len(binary_list), 5)] # 将2进制字符串列表转换为32进制字符串 base32_str = '' for binary_str in binary_list_5: base32_str += base32_dict[''.join(binary_str)] return base32_str # 输入 print(binary_to_base32('1101110110111')) # 输出:6TN
2、【4进制】 转 2进制、8进制、10进制、16进制、32进制
# 4进制 转 2进制 # 输入 print(bin(int('1101110110111',4))) # 输出:0b1010001010100010100010101
# 4进制 转 8进制 # 输入 print(oct(int('1101110110111',4))) # 输出:0o121242425
# 4进制 转 10进制 # 输入 print(str(int('1101110110111',4))) # 输出:21316885
# 4进制 转 16进制 # 输入 print(hex(int('1101110110111',4))) # 输出:0x1454515
# 4进制 转 32进制 def binary_to_base32(binary): # 4进制 转 2进制 binary = bin(int(binary,4)) if binary[0:][:2] == '0b': binary = binary.replace('0b','') # 2进制 转 32进制 # 定义一个字典,用于存储2进制到32进制的映射关系 base32_dict = { '00000': '0', '00001': '1', '00010': '2', '00011': '3', '00100': '4', '00101': '5', '00110': '6', '00111': '7', '01000': '8', '01001': '9', '01010': 'A', '01011': 'B', '01100': 'C', '01101': 'D', '01110': 'E', '01111': 'F', '10000': 'G', '10001': 'H', '10010': 'I', '10011': 'J', '10100': 'K', '10101': 'L', '10110': 'M', '10111': 'N', '11000': 'O', '11001': 'P', '11010': 'Q', '11011': 'R', '11100': 'S', '11101': 'T', '11110': 'U', '11111': 'V' } binary = (5 - len(binary) % 5) * '0' + binary # 将2进制字符串转换为列表 binary_list = list(binary) # 将2进制列表转换为5位2进制字符串的列表 binary_list_5 = [binary_list[i:i+5] for i in range(0, len(binary_list), 5)] # 将2进制字符串列表转换为32进制字符串 base32_str = '' for binary_str in binary_list_5: base32_str += base32_dict[''.join(binary_str)] return base32_str # 输入 print(binary_to_base32('11011101101111011')) # 输出:52KA5A5
3、【8进制】 转 2进制、4进制、10进制、16进制、32进制
# 8进制 转 2进制 # 输入 print(bin(int('1101110110111',8))) # 输出:0b1001000001001001000001001000001001001
# 8进制 转 4进制 def binary_to_quaternary(binary): # 将8进制转换为10进制 decimal = int(binary,8) # 将10进制转换为4进制 quaternary = '' while decimal != 0: remainder = decimal % 4 decimal = decimal // 4 quaternary = str(remainder) + quaternary return quaternary # 输入 print(binary_to_quaternary('1101110110111')) # 输出:1020021020021001021
# 8进制 转 10进制 # 输入 print(str(int('1101110110111',8))) # 输出:77462540361
# 8进制 转 16进制 # 输入 print(hex(int('1101110110111',8))) # 输出:0x1209209049
# 8进制 转 32进制 def binary_to_base32(binary): # 8进制 转 2进制 binary = bin(int(binary,8)) if binary[0:][:2] == '0b': binary = binary.replace('0b','') # 2进制 转 32进制 # 定义一个字典,用于存储2进制到32进制的映射关系 base32_dict = { '00000': '0', '00001': '1', '00010': '2', '00011': '3', '00100': '4', '00101': '5', '00110': '6', '00111': '7', '01000': '8', '01001': '9', '01010': 'A', '01011': 'B', '01100': 'C', '01101': 'D', '01110': 'E', '01111': 'F', '10000': 'G', '10001': 'H', '10010': 'I', '10011': 'J', '10100': 'K', '10101': 'L', '10110': 'M', '10111': 'N', '11000': 'O', '11001': 'P', '11010': 'Q', '11011': 'R', '11100': 'S', '11101': 'T', '11110': 'U', '11111': 'V' } binary = (5 - len(binary) % 5) * '0' + binary # 将2进制字符串转换为列表 binary_list = list(binary) # 将2进制列表转换为5位2进制字符串的列表 binary_list_5 = [binary_list[i:i+5] for i in range(0, len(binary_list), 5)] # 将2进制字符串列表转换为32进制字符串 base32_str = '' for binary_str in binary_list_5: base32_str += base32_dict[''.join(binary_str)] return base32_str # 输入 print(binary_to_base32('1101110110111')) # 输出:284I1429
4、【10进制】 转 2进制、4进制、8进制、16进制、32进制
# 10进制 转 2进制 # 输入 print(bin(int('1101110110111',10))) # 输出:0b1001000001001001000001001000001001001
# 10进制 转 4进制 def dec2four(num): # 定义一个空列表,用于存放转换后的四进制数 four_list = [] num = int(num) # 循环,直到num为0 while num != 0: # 将num除以4的余数添加到列表中 four_list.append(num % 4) # 将num除以4,得到新的num num = num // 4 # 将列表中的数字反转 four_list.reverse() # 将列表中的数字转换为字符串 four_str = ''.join(str(i) for i in four_list) # 返回转换后的四进制数 return four_str # 输入 print(dec2four('1101110110111')) # 输出:100001133101232132133
# 10进制 转 8进制 # 输入 print(oct(int('1101110110111',10))) # 输出:0o20013721563637 # 10进制 转 16进制 # 输入 print(hex(int('1101110110111',10))) # 输出:0x1005f46e79f
# 10进制 转 32进制 def binary_to_base32(num, b = 32): num = int(num) return ((num == 0) and "0") or (binary_to_base32(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b]) # 输入 print(binary_to_base32('1101110110111')) # 输出:101fkdpsv
5、【16进制】 转 2进制、4进制、8进制、10进制、32进制
# 16进制 转 2进制 # 输入 print(bin(int('1241241243',16))) # 输出:0b1001001000001001001000001001001000011
# 16进制 转 4进制 def binary_to_quaternary(binary): # 将16进制转换为10进制 decimal = int(binary, 16) # 将10进制转换为4进制 quaternary = '' while decimal != 0: remainder = decimal % 4 decimal = decimal // 4 quaternary = str(remainder) + quaternary return quaternary # 输入 print(binary16_to_quaternary('1241241243')) # 输出:1021001021001021003
# 16进制 转 8进制 # 输入 print(oct(int('1241241243',16))) # 输出:0o1110111011103
# 16进制 转 10进制 # 输入 print(str(int('1241241243',16))) # 输出:78402294339
# 16进制 转 32进制 def binary_to_base32(binary): # 16进制 转 2进制 binary = bin(int(binary,16)) if binary[0:][:2] == '0b': binary = binary.replace('0b','') # 2进制 转 32进制 # 定义一个字典,用于存储2进制到32进制的映射关系 base32_dict = { '00000': '0', '00001': '1', '00010': '2', '00011': '3', '00100': '4', '00101': '5', '00110': '6', '00111': '7', '01000': '8', '01001': '9', '01010': 'A', '01011': 'B', '01100': 'C', '01101': 'D', '01110': 'E', '01111': 'F', '10000': 'G', '10001': 'H', '10010': 'I', '10011': 'J', '10100': 'K', '10101': 'L', '10110': 'M', '10111': 'N', '11000': 'O', '11001': 'P', '11010': 'Q', '11011': 'R', '11100': 'S', '11101': 'T', '11110': 'U', '11111': 'V' } binary = (5 - len(binary) % 5) * '0' + binary # 将2进制字符串转换为列表 binary_list = list(binary) # 将2进制列表转换为5位2进制字符串的列表 binary_list_5 = [binary_list[i:i+5] for i in range(0, len(binary_list), 5)] # 将2进制字符串列表转换为32进制字符串 base32_str = '' for binary_str in binary_list_5: base32_str += base32_dict[''.join(binary_str)] return base32_str # 输入 print(binary16_to_base32('1241241243')) # 输出:290I84I3
6、【32进制】 转 2进制、4进制、8进制、10进制、16进制
# 32进制 转 2进制 # 输入 print(bin(int('123456789',32))) # 输出:0b10001000011001000010100110001110100001001
# 32进制 转 4进制 def binary_to_quaternary(binary): # 将32进制转换为10进制 decimal = int(binary, 32) # 将10进制转换为4进制 quaternary = '' while decimal != 0: remainder = decimal % 4 decimal = decimal // 4 quaternary = str(remainder) + quaternary return quaternary # 输入 print(binary_to_quaternary('123456789')) # 输出:101003020110301310021
# 32进制 转 8进制 # 输入 print(oct(int('123456789',32))) # 输出:0o21031024616411
# 32进制 转 10进制 # 输入 print(str(int('123456789',32))) # 输出:1171591994633
# 32进制 转 16进制 # 输入 print(hex(int('123456789',32))) # 输出:0x110c8531d09
以上就是Python实现加解密,编码解码和进制转换(最全版)的详细内容,更多关于Python加解密 编码解码 进制转换的资料请关注脚本之家其它相关文章!