名奢网 名表 名表日报 查看内容

教程|Python3下常用编解码与加解密,有四种你都有了解吗?

2022-12-3 16:24| 发布者: fuwanbiao| 查看: 87| 评论: 0

放大 缩小
简介:字符编解码Python3相关于Python2的一大改动就是,对默许字符类型中止了修正。Python2中定义字符串默许为二进制字符串,强迫加前缀u的才是unicode字符串;而Python3中字符串默许为unicode,强迫加前缀b的才是二进制字 ...

教程|Python3下常用编解码与加解密,有四种你都有了解吗?


字符编解码

Python3相关于Python2的一大改动就是,对默许字符类型中止了修正。Python2中定义字符串默许为二进制字符串,强迫加前缀u的才是unicode字符串;而Python3中字符串默许为unicode,强迫加前缀b的才是二进制字符串。(也就是刚好反过来了)

教程|Python3下常用编解码与加解密,有四种你都有了解吗?


这里的二进制字符串:指的是中止过编码后的字符串。即utf8、gbk、ascii等编码后的串都是二进制的。寄存到文件的时分也必须是二进制的内容。


unicode字符串:是一种在内存中存在的编码规范,它能够和恣意其它类型的编码中止转换。好比:utf-8、gbk、ascii等。并且其它编码在中止相互转换时,都必须经过unicode来中转。该字符串只在内存中存在,没有细致的编码完成。


以"中国"为例,来看下各种编码方式下的表示方式:


"中国"unicode:\u4e2d\u56fdutf8:\xe4\xb8\xad\xe5\x9b\xbdgbk:\xd6\xd0\xb9\xfa

能够看到同样的字符串,在不同的编码中其对应的值是不一样的。但是不论哪种编码都能够转成unicode,unicode也能够转成恣意其它的编码。(unicode被称为万国码,是世界上最大的字符集,能够支持编码全球的言语,但目前在编的并不是全部)


1、编码


python3中字符编码很简单。直接经过encode措施即可。(该措施只需unicode字符对象才有,Python3中unicode是str对象)


s = '中国' # => unicodeprint(type(s)) # => strs2 = s.encode('utf8') # => utf8print(type(s2)) # => bytes3 = s.encode('gbk') # => gbkprint(type(s3)) # => byte

2、解码


Python3中解码用的是decode措施。(该措施只需byte对象才有)


b = b'中国' # => 细致编码编程环境的默许编码而定,通常为utf8print(type(b)) # => byteb1 = b.decode('utf8') # => unicodeprint(type(b1)) # => str

URL编解码

1、解析URL字符串


from urllib import parseurl = 'https://www.baidu.com/s?wd=python3%20url编码'parsed = parse.urlparse(url)print(parsed)

urlparse会把完好的URL串解析成各个部分,方便我们直接提取特定内容。其执行结果如下:


ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=python3%20url编码', fragment='')

即解析后合成为:协议,域名、途径、参数、查询字符串等。我们能够直接运用对应的属性名来获取。好比:获取query内容。


print(parsed.query) # => wd=python3%20url编码

2、query参数编码


由于query参数对应的是GET央求时,附件在URL途径后的查询参数。为了避免阅读器解析到特殊字符而招致不可预知的问题,所以通常需求对其内容中止编码,称为URLEncode。Python3中编码的方式如下:


d = { 'name': '陈霸天', 'sex': 'male', 'age': 18}query = parse.urlencode(d)print(query) # => name=%E9%99%88%E9%9C%B8%E5%A4%A9&sex=male&age=18

运用urlencode措施,能够很方便的对一个给定的字典对象的键值内容中止编码,并串联成一个有效格式的query字符串。能够直接附件到URL途径后来运用。(中间需求?链接)


3、query参数解码


有编码就有对应的解码措施,python3中其对应的解码措施不是urldecode,而是parse_qs措施。细致如下:


query = 'name=%E9%99%88%E9%9C%B8%E5%A4%A9&sex=male&age=18'd = parse.parse_qs(query)print(d) # => {'name': ['陈霸天'], 'sex': ['male'], 'age': ['18']}

留意返回的字典中,其value值都是list对象。这是由于有些键可能有多个值的状况。(正常可能会发作的状况)


4、纯字符串URL编码


上面措施是对字典对象中止的编码,假如只需对单个字符串内容编码, 则能够运用quote措施。


s = '中国'print(parse.quote(s)) # => %E4%B8%AD%E5%9B%BD

5、纯字符串URL解码


字符串的解码措施是和编码措施对应的叫unquote。运用方式如下:


s = '%E4%B8%AD%E5%9B%BD'print(parse.unquote(s)) # => 中国

编解码

1、编码


是一种对二进制中止编码的一种方式;之所以叫编码是由于经过这个算法中止编码之后,其内容只在规则的64个可打印字符之内。(0-9、a-z、A-Z、+、/)。python3中对字符中止编码的方式如下:


import src = '中国'.encode('utf8')print("明文:", src)enc = .b64encode(src)print("密文:", enc)

这段代码运转后的结果:


明文: b'\xe4\xb8\xad\xe5\x9b\xbd'密文: b'5Lit5Zu9'

能够看到b64encode措施接纳的是一个二进制类型的字符串,返回的也是一个二进制类型的字符串。


2、解码


同编码相反的就是解码了,的解码也很简单。


import enc = b'5Lit5Zu9'print("密文:", enc)src = .b64decode(enc)print("明文:", src)print("unicode:", src.decode('utf8'))

执行后的代码如下:


密文: b'5Lit5Zu9'明文: b'\xe4\xb8\xad\xe5\x9b\xbd'unicode: 中国

3、BASE16编解码


库除了能够中止编码外,还能够支持BASE16编解码码。其运用方式如下:


import src = '中国'.encode('utf8')print("明文:", src)enc = .b16encode(src)print("密文:", enc)src = .b16decode(enc)print("明文:", src)print("unicode:", src.decode('utf8'))执行结果如下:明文: b'\xe4\xb8\xad\xe5\x9b\xbd'密文: b'E4B8ADE59BBD'明文: b'\xe4\xb8\xad\xe5\x9b\xbd'unicode: 中国

与编码后的内容不同,BASE16的编码后内容其实是有规律的。认真看下明文和密文,能够发现其实是一种对应关系。好比:明文中的\xe4,对应的是密文中的E4;以此类推。即BASE16只是把二进制在内存中的数值运用16进制字符串来表示而已。


AES加解密

1、AES加密


AES(Advanced Encryption Standard)是一种加密技术和规范。其实DES(Data Encryption Standard)加密的升级版。该加密算法是一种对称加密,即便用相同的key来中止加密和解密。Python3中中止AES加密的方式如下:


import from Crypto.Cipher import AESdef ensure_to_16(value): pad = 16 - len(value) % 16 return value + b'\x00' * pad if pad != 16 else valuekey = b'123456'iv = b'ABCD'src = '中国'.encode('utf8')# AES ECB encryptaes = AES.new(ensure_to_16(key), AES.MODE_ECB)print('src:', src)enc = aes.encrypt(ensure_to_16(src))print('enc:', enc)base_str = .encodebytes(enc)print('base_str:', base_str)# AES CBC encrypt, need iv argaes = AES.new(ensure_to_16(key), AES.MODE_CBC, iv=ensure_to_16(iv))print('src:', src)enc = aes.encrypt(ensure_to_16(src))print('enc:', enc)base_str = .encodebytes(enc)print('base_str:', base_str)

上面的代码中需求阐明的是,ensure_to_16主要作用是把key、iv、src等内容的长度补齐到16的整数倍。这个AES加密的规范请求,其中key、iv还能够是32、48等的整数倍,而src只能是16的整数倍。


另外,上面演示了2种加密类型,第一种是ECB,第二种CBC。其中第一种为不需求iv,第二种需求iv(初始化向量,俗称盐)参数。


代码执行效果如下:


src: b'\xe4\xb8\xad\xe5\x9b\xbd'enc: b'3+z@P4\x98\x0c\x1d\x9a\xce#F\xdf\xec\x1d'base_str: b'Myt6QFA0mAwdms4jRt/sHQ== 'src: b'\xe4\xb8\xad\xe5\x9b\xbd'enc: b'4\xd7\xa42U:Yz\xc7>\xba\\xb2\x96\x81 'base_str: b'NNekMlU6WXrHPrpcspaBCg== '

2、AES解密


AES解码时需求运用相同的key、iv和方式,有一个不分歧都会招致解密失败。细致代码如下:


import from Crypto.Cipher import AESdef ensure_to_16(value): pad = 16 - len(value) % 16 return value + b'\x00' * pad if pad != 16 else valuekey = b'123456'iv = b'ABCD'b64_str = b'NNekMlU6WXrHPrpcspaBCg== '# AES CBC decrypt, need iv argaes = AES.new(ensure_to_16(key), AES.MODE_CBC, iv=ensure_to_16(iv))print('b64_str:', b64_str)enc = .decodebytes(b64_str)print('enc:', enc)src = aes.decrypt(enc)print('src:', src)

上面代码以CBC方式为例,对密文中止了解密。其执行的结果如下:


b64_str: b'NNekMlU6WXrHPrpcspaBCg== 'enc: b'4\xd7\xa42U:Yz\xc7>\xba\\xb2\x96\x81 'src: b'\xe4\xb8\xad\xe5\x9b\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

能够看到明文src中的内容是以\x00补齐的,细致操作时还需求对其中止处置。好比:


src = b'\xe4\xb8\xad\xe5\x9b\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'print(src.strip(b'\x00').decode('utf8')) # => 中国

好了,到此为止这边文章曾经终了了。你都知道吗?



路过

雷人

握手

鲜花

鸡蛋
已有 0 人参与

会员评论

文章排行

  • 阅读
  • 评论

最新文章

文章列表

 名表回收网手机版

官网微博:名表回收网服务平台

今日头条二维码 1 微信公众号二维码 1 抖音小程序二维码 1
浙江速典奢贸易有限公司 网站经营许可证 备案号:浙ICP备19051835号2012-2022
名表回收网主要专注于手表回收,二手名表回收/销售业务,可免费鉴定(手表真假),评估手表回收价格,正规手表回收公司,浙江实体店,支持全国范围上门回收手表
返回顶部