志在指尖
用双手敲打未来

python编码(python代码加密)

python编码

在编写python程序的过程中,中英文混用经常会呈现编码问题。围绕此问题,本文首要介绍编码的意义及常用编码,随后罗列几个python经常遇到的编码反常及解决方法,接着罗列笔者在实践中遇到的反常呈现的情景及原因,最后针对编码问题提出最佳实践。
一常见编码
1.1unicode编码
在文本文件中,看到的一切字符,包括中文,都需求在计算机中存储,而计算机只能存储0和1这样的二进制位,所以需求一种方法,将字符映射成数字,然后将数字转化为二进制位存储在计算机中。针对字符和数字的映射的问题,产生了unicode编码,unicode将世界上的一切字符映射为唯一的数字。unicode数字并不是直接就能够转化为二进制存储,比方假定中文字符‘中’映射为数字1(00000001),‘国’映射为数字2(00000010),因为汉字许多,单字节并不能表明完一切的汉字,故可能会有汉字的unicode数字为258(0000000100000010),假定为‘京’,现在在字符串中碰到存储为0000000100000010的二进制串,不能区分出其实际代表的是“我国”仍是“京”。
针对unicode数字和二进制的映射问题,有两种解决方法:一种是每个unicode数字用固定宽度的二进制位表明,比方都用两字节,由此产生了ASCII、GB2312、GBK编码;另一种是存储的二进制位除了表明数字之外,还表明每个unicode数字的长度,由此产生了utf-8编码。
1.2ASCII编码
ASCII编码用单字节表明字符,最高位固定为0,故最多只能表明128个字符,当编程只触及到英文字符或数字时,不触及中文字符时,能够运用ASCII编码。
1.3GB2312编码、GBK
GB(GuoBiao)为国标,GBK(GuoBiaoKuozhan)表明国标扩展。GB2312兼容ASCII编码,对于ASCII能够表明的字符,如英文字符‘A’、‘B’等,在GB2312中的编码和ASCII编码一致,占一个字节,对于ASCII不能表明的字符,GB2312用两个字节表明,且最高位不为0,以防和ASCII字符抵触。例如:‘A’在GB2312中存储的字节十六进制为41,在ASCII中也是41,中文字符‘中’在GB2312中存储的两个字节十六进制为D6D0,最高位为1不为0。
GB2312只有6763个汉字,而汉字特别多。GBK属于GB2312的扩展,增加了许多汉字,一起兼容GB2312,相同用两个字节表明非ASCII字符。
1.4UTF-8编码
和GB系列不同,UTF-8能够将全世界一切的unicode数字表明出来。UTF-8兼容ASCII编码,不兼容GB系列编码,因而,若文本中UTF-8和GB系列编码混用,会呈现乱码问题。UTF-8对于每个字符的存储,用最高二进制位开端连续1的个数表明字的长度,最高位为0表明单字节,用来兼容ASCII字符,为110表明双字节,非字符首字节的字节都以10开端,如下表格所示。例如:字符‘中’的unicode编码为2D4E(0010110101001110),用UTF-8存储的二进制为E4B8AD(111001001011100010101101),存储在计算机中的首字节为1110最初,表明此字符占三个字节,去掉开端字节表明长度的1110和其他字节最初的10,能够得到0100111000101101(4E2D),能够看到和unicode数字刚好相反,是因为是大端存储方法,高字节存储在内存中的低地址端,反过来即为unicode编码。
字节数二进制编码格局
单字节0XXXXXXX
双字节110XXXXX10XXXXXX
三字节1110XXXX10XXXXXX10XXXXXX
四字节11110XXX10XXXXXX10XXXXXX10XXXXXX
五字节111110XX10XXXXXX10XXXXXX10XXXXXX10XXXXXX
六字节1111110X10XXXXXX10XXXXXX10XXXXXX10XXXXXX10XXXXXX
二python字符序列及编码问题
上一节对几种常见的编码原理做出了介绍,以便理解python因为编码引起的反常,本节将对python中的字符串作出介绍,并在此基础上提出几种常见的编码反常,并提供解决方案。
2.1python2和python3字符序列
python2中字符序列有两种类型:unicode和str。unicode字符序列存储的元素为unicode字符。如图2.1所示,unicode_string代表unicode字符序列“我国”,其长度为2,刚好表明两个unicode字符。
python2中的另一种字符序列是str类型,str类型的字符序列其实是unicode字符序列encode之后的值,用不同的编码类型encode,得出的值不一样。str字符序列的元素为字节,如图2.2所示,“我国”的str字符序列长度为6,为UTF-8编码后所占字节长度。
与unicode字符串转化为str类型用encode相反,str类型的字符序列转化为unicode字符串,能够经过decode方法,如图2.3所示:
python3中的字符序列也有两种类型:bytes和str。python3中的bytes和python2中的str类似,str和python2中的unicode类似。这里要注意,str类型在python3和python2中都有,但意义彻底变了。
2.2常见编码问题
2.2.1UnicodeEncoderError
将文本转化为字节序列时,若有字符在方针编码中没有界说,则会呈现UnicodeEncoderError。如图2.5所示,因为中文字符在ascii编码中无界说,则会报出编码错误。对于此类问题,需挑选合适的编码类型,比方含有中文字符,一般用UTF-8编码类型对unicode字符串编码。
2.2.2UnicodeDecodeError
把二进制序列转化为文本时,遇到无法转化的字节序列,则会发生此反常。比方用UTF-8编码后的二进制序列,用GB2312解码,因为两种编码不兼容,用GB2312不能辨认字节序列,则会呈现反常,如图2.6所示。
碰到这种反常,是因为decode运用的编码和字节序列的编码不一致,能够用字符编码侦测包chardet检测字节序列的编码,然后再用此编码解码。如图2.7所示:
三实践中常见编码反常场景
3.1字符串衔接
python代码
1#-*-coding:utf-8-*-2unicode_string=u’我国’3str_string=’我国’4merge_string=str_string+unicode_string#UnicodeDecodeError:’ascii’codeccan’tdecodebyte0xe4inposition0:ordinalnotinrange(128)
python代码
1#-*-coding:utf-8-*-2unicode_string=u’我国’3str_string=’我国’4″我国:%s”%str_string5#两种字符序列混用,相当于”我国:%s”.decode(‘ascii’)%unicode_string6″我国:%s”%unicode_string#UnicodeDecodeError:’ascii’codeccan’tdecodebyte0xe4inposition0:ordinalnotinrange(128)7u”我国:%s”%unicode_string8#两种字符序列混用,相当于u”我国:%s”%str_string.decode(‘ascii’)9u”我国:%s”%str_string#UnicodeDecodeError:’ascii’codeccan’tdecodebyte0xe4inposition0:ordinalnotinrange(128)
仿制代码
当str类型字符串和unicode类型字符串混合运算时,python默认会将str类型字符串转化为unicode字符串,因为不知道str类型字符串的编码格局,会运用sys.getdefaultencoding(),而默认的defaultencoding一般是ascii,故会犯错。
3.2print中文问题
如图3.1,python打印变量时,操作系统会对变量进行相应的处理,若变量是str类型,则操作系统直接发送到终端显示,若变量是unicode类型,则操作系统会对变量用sys.stdout.encoding编码对变量encode,若变量中含有sys.stdout.encoding未界说字符,则会呈现UnicodeEncodeError。编码后字节序列被发送给终端,假若终端设置的编码和str编码不一致,终端就会显示出乱码。
四最佳实践
编写python程序时,为避免不同类型字符串混用呈现编解码反常,要把编码和解码操作放在程序的最外围来做,程序的中心逻辑统一运用unicode字符类型。下面分别对python2和python3编写了外围编码转化东西类。
1#python2,unicode和utf-8类型的str互相转化2#file:python2_endecode_helper.py34#-*-coding:utf-8-*-5defto_unicode(unicode_or_str):6ifisinstance(unicode_or_str,str):7value=unicode_or_str.decode(‘UTF-8’)8else:9value=unicode_or_str10returnvalue1112defto_str(unicode_or_str):13ifisinstance(unicode_or_str,unicode):14value=unicode_or_str.encode(‘UTF-8′)15else:16value=unicode_or_str17returnvalue1819if__name__==’__main__’:20unicode_string=u’我国’21value=to_str(unicode_string)22printtype(value)#23value=to_unicode(value)24printtype(value)#
#python3,str和bytes类型相互转化东西类#file:python3_endecode_helper.pydefto_str(bytes_or_str):ifisinstance(bytes_or_str,bytes):
value=bytes_or_str.decode(‘UTF-8’)else:
value=bytes_or_strreturnvaluedefto_bytes(bytes_or_str):ifisinstance(bytes_or_str,str):
value=bytes_or_str.encode(‘UTF-8′)else:
value=bytes_or_strreturnvalueif__name__==’__main__’:
str_string=u’我国’value=to_bytes(str_string)print(type(value))#value=to_str(value)print(type(value))#python

python代码加密

Python越来越抢手了,2019年3月TIOBE编程言语排行榜上,Python更是稀有的击败了“霸榜三巨头”之一的C++,挤进前三。
Python长处许多,比方简单易学,代码量少,能做的事许多等等,和其他言语一样,Pyhton也有一些不行掩盖的缺陷,版别不兼容,运转效率不高等等。
其间一个缺陷,让不少开发者头疼不已,因为Python解说器开源的关系,导致Python代码无法加密,代码的安全性得不到保障。
当然,想要加密Python代码,也并非无解。最常见的加密办法有4种,还有1种共同的加密办法。
1
Python解说器在履行代码的过程中,会首先生成.pyc文件,然后再解说履行.pyc中的内容,当然,解说器也能直接履行.pyc文件。
.pyc文件是一个二进制的文件,是不具备可读性的。
假如咱们发到客户环境时,是.pyc文件,而不是.py,那么是不是就能够维护咱们的Python代码?
想要做到这一点,并不难。Python标准库就供给了一个名叫compileall的库,运用它就能够做到。
履行如下命令,即可将目录下的一切.py文件编译成.pyc文件:
python-mcompileall然后删去目录下一切.py文件就能够了。
$find-name’*.py’-typef-print-execrm{}\;
这一办法,能够加密咱们的Python代码,胜过代码裸在外面。尴尬的是,因为Python解说器的兼容较差,有些版别并不能运转.pyc文件。而且已经有现成的反编译东西,能够直接破解。
比方python-uncompyle6(「链接」),只要履行以下命令,就能够搞定。
$uncompyle6*compiled-python-file-pyc-or-pyo*
2
代码混杂,也是一种常见的“加密”办法,严格含义上说,这一办法并不是加密,而是上代码的可读性变差。比方删去注释,增加毫无含义的注释,增加无效代码,对变量、函数、类进行重命名等。
内容不行读,代码就受到了维护。
代码混杂的东西许多,一个比较好用的混杂库是pyobfuscate(GitHub-astrand/pyobfuscate:pyobfuscate)。这个库能够对类、函数进行重命名,并且刺进无关的代码,甚至主动加空格等等。
这一办法很简单,也提高了破解的门槛。但因为代码结构未发生变化,字节码也能获取,破解难度也不高。
一般来说,运用这一办法较为简单,有用。
3
假如有一款东西,能够将Python脚本打包成在某一渠道的可履行文件,最终咱们发行的,是一份打包完成的二进制文件,那么程序就更难被破解了?
py2exe(FrontPage-py2exe.orgFrontPage-py2exe.org)便是一款很好的打包东西,能够将Python脚本打包成可在Windows上运转的文件。
这一办法的长处是进一步提高了破解门槛。惋惜的是,你只能在windows上运转它。
4
Python运转速度慢何解?用Cython就能够带来功能的提升。实际上,Cython也能够用来加密Python代码。
Cython的原理是,将.py编译为.c文件,再将.c文件编译为.so或者.pyd,这样一来,文件就变得难以破解了。
这样做的优点是,Python代码很难被破解,缺陷是有时候,Cython可能不支持一小部分代码,完善起来就比较麻烦了。
5
最后一种办法,做得比较绝。
因为Python是解说型言语,因此在发行Python程序的时候,就必须包含一个Python解说器,假如咱们修改这个解说器,代码不就被维护起来了吗?
假如咱们能对最原始的Python代码进行加密,加密后的代码被发行后。哪怕被别人看到了,但因为不晓得算法是怎样的,就破解不了了。
这是因为Python解说器本身是一个二进制文件,天然也就无法取得关键性的数据,从而维护了源码。
虽然这一办法最为安全,可操作难度较高。你必须把握根本的加解密算法,还要探求Python履行代码的办法,从而了解到从什么地方进行加解密。最后禁用字节码,以防经过.pyc反编译即可。

未经允许不得转载:IT技术网站 » python编码(python代码加密)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载