




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编码解码-加密1.编码解码编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在点击计算机、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码就是编码的逆过程。编码制定时间作用所占字节数ASCII1967年表示英语及西欧语言8bit/1bytesGB23121980年国家简体中文字符集,兼容ASCII2bytesUnicode1991年国际标准组织统一标准字符集2bytesGBK1995年GBK2312的扩展字符集,支持繁体字,兼容GB23122bytesUTF-81992年不定长编码1-3bytes第一种:ASCII码ASCII(AmericanStandardCodeforInformationInterchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC646第二种:GBK和GB2312
对于我们来说能在计算机中显示中文字符是至关重要的,然而ASCII表里连个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。第三种:Unicode因为各个国家都一套自己的编码,就不可避免会有冲突,因此,Unicode应运而生。Unicode把所有语言都统一至『套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。注:在python中使用函数encode()进行编码,使用decode()进行解码。函数decode(char_set)可以实现从其他编码到Unicode的转换,函数encode(char_set)可以实现从Unicode到其他编码方式的转换。实验一:执行以下python代码,通过输出,比较每种编码的不同之处#-*-coding:utf-8-*-s='安全实验’s1=s.encode('utf-8')print(s1,type(s1))#utf-8print(s1,type(s1))#utf-8编码s2=s1.decode("utf-8")#utf-8转成Unicode,decode解码)需要注明当前编码格式print(s2,type(s2))s3=s2.encode("gbk")#Unicode转成gbk,encode(编码)需要注明生成的编码格式print(s3,type(s3))s4=s2.encode("utf-8")#Unicode转成utf-8,encode(编码)注明生成的编码格式print(s4,type(s4))结果为:b'\xe5\xae\x89\xe5\x85\xa8\xe5\xae\x9e\xe9\xaa\x8c'<class'bytes'>安全实验<class'str'>b'\xb0\xb2\xc8\xab\xca\xb5\xd1\xe9'<class'bytes'>b'\xe5\xae\x89\xe5\x85\xa8\xe5\xae\x9e\xe9\xaa\x8c'<class'bytes'>2.加密1.前言加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串和Bytes互相转换可以使用encode()和decode()方法。如下所示:#方法中不传参数则是以默认的utf-8编码进行转换In[1]:‘安全'.encode()Out[1]:b'\xe5\xae\x89\xe5\x85\xa8'In[2]:b'\xe5\xae\x89\xe5\x85\xa8'.decode()Out[2]:'安全’注:两位十六进制常常用来显示一个二进制字节。利用binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式:In[1]:importbinasciiIn[2]:'安全'.encode。Out[2]:b'\xe5\xae\x89\xe5\x85\xa8'In[3]:binascii.b2a_hex('安全'.encode())Out[3]:b'e5ae89e585a8'In[4]:binascii.a2b_hex(b'e5ae89e585a8')Out[4]:b'\xe5\xae\x89\xe5\x85\xa8'In[5]:binascii.a2b_hex(b'e5ae89e585a8').decode()Out[5]:‘安全’URL编码正常的URL中是只能包含ASCII字符的,也就是字符、数字和一些符号。而URL编码就是一种浏览器用来避免url中出现特殊字符(如汉字)的编码方式。其实就是将超出ASCII范围的字符转换成带%的十六进制格式。例子:In[1]:fromurllibimportparse#quote()方法会自动将str转换成bytes,所以这里传入str和bytes都可以In[2]:parse.quote('安全')Out[2]:'%E5%AE%89%E5%85%A8'In[3]:parse.unquote('%E5%AE%89%E5%85%A8')Out[3]:'安全'Base64编码Base64是一种用64个字符来表示任意二进制数据的方法。Base64编码可以称为密码学的基石。可以将任意的二进制数据进行Base64编码。所有的数据都能被编码为并只用65个字符就能表示的文本文件。(65字符:A〜Za〜z0-9+/=)编码后的数据〜二编码前数据的4/3,会大1/3左右。原理b1b2b3n1n2n3n4.将所有字符转化为ASCII码。.将ASCII码转化为8位二进制。.将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。.统一在6位二进制前补两个0凑足8位。.将补0后的二进制转为十进制。.从Base64编码表获取十进制对应的Base64编码。说明.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。.不断进行,直到全部输入数据转换完成。.如果最后剩下两个输入数据,在编码结果后加1个“=”。.如果最后剩下一个输入数据,编码结果后加2个“=”。.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。python使用Python内置的base64模块可以直接进行base64的编解码注意:用于base64编码的,要么是松酊1包含的字符,要么是二进制数据In[1]:importbase64In[2]:base64.b64encode(b'helloworld')Out[2]:b'aGVsbG8gd29ybGQ='In[3]:base64.b64decode(b'aGVsbG8gd29ybGQ=')Out[3]:b'helloworld'MD5(信息-摘要算法)message-digestalgorithm5(信息-摘要算法)。经常说的“MD5加密”,就是信息摘要算法。md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串就是唯一的。目前破解MD5加密的字符串只能通过查询数据库表中存储的已知的密文来解密,因此只能破解少部分常用的密文。特点.压缩性:任意长度的数据,算出的MD5值长度都是固定的。.容易计算:从原数据计算出MD5值很容易。.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。.强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。.不可逆性:每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。举个栗子:世界上只有一个我,但是但是妞却是非常非常多的,以一个有限的我对几乎是无限的妞,所以可能能搞定非常多(100+)的妞,这个理论上的确是通的,可是实际情况下....python使用由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作importhashlib待加密信息str='这是一个测试‘创建md5对象hl=hashlib.md5()此处必须声明encode若写法为hl.update(str)报错为:Unicode-objectsmustbeencodedbeforehashinghl.update(str.encode(encoding='utf-8'))print('MD5加密前为:'+str)print('MD5加密后为:'+hl.hexdigest())运行结果MD5加密前为:这是一个测试MD5加密后为:cfca700b9e09cf664f3ae80733274d9fmd5的长度,默认为128bit,也就是128个0和1的二进制串。这样表达是很不友好的。所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4=32换成16进制表示后,为32位了。Python力口密库PyCryptodomePyCrypto是Python中密码学方面最有名的第三方软件包,提供了许多加密算法的使用。可惜的是,它的开发工作于2012年就已停止。幸运的是,有一个该项目的分支PyCrytodome取代了PyCrypto。DESDES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。python使用导入DES模块fromCryptodome.CipherimportDESimportbinascii这是密钥key=b,abcdefgh,需要去生成一个DES对象des=DES.new(key,DES.MODE_ECB)需要加密的数据text='安全’text=text+(8-(len(text)%8))*'='加密的过程encrypto_text=des.encrypt(text.encode())encrypto_text=binascii.b2a_hex(encrypto_text)print(encrypto_text)结果为b'084725d8f5ffafc61814fae0796bfd2f'3DES3DES(或称为TripleDES)是三重数据加密算法(TDEA,TripleDataEncryptionAlgorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解。3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。3DES(即TripleDES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:3DES加密过程为:C=Ek3(Dk2(Ek1(M)))3DES解密过程为:M=Dk1(EK2(Dk3(C)))AES高级加密标准(英语:AdvancedEncryptionStandard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,E经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院小卫丁)于2001年11月26日发布于FIPSPUB197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES在软件及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的存储器。作为一个新的加密标准,目前正被部署应用到更广大的范围。特点.抵抗所有已知的攻击。.在多个平台上速度快,编码紧凑。.设计简单。发送方桂收方AES加密函数发送方桂收方AES加密函数AES解超困数AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。一般常用的是128位Python实现fromCryptodome.CipherimportAESfromCryptodomeimportRandomfrombinasciiimportb2a_hex要加密的明文data='安全实验'密钥key长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes长度.目前AES-128足够用key=b,thisisa16key,生成长度等于AES块大小的不可重复的密钥向量iv=Random.new().read(AES.block_size)使用key和iv初始化AES对象,使用MODE_CFB模式mycipher=AES.new(key,AES.MODE_CFB,iv)加密的明文长度必须为16的倍数,如果长度不为16的倍数,则需要补足为16的倍数将iv(密钥向量)加到加密的密文开头,一起传输ciphertext=iv+mycipher.encrypt(data.encode())解密的话要用key和iv生成新的AES对象mydecrypt=AES.new(key,AES.MODE_CFB,ciphertext[:16])使用新生成的AES对象,将加密的密文解密decrypttext=mydecrypt.decrypt(ciphertext[16:])print('密钥k为:',key)print('iv为:',b2a_hex(ciphertext)[:16])print('加密后数据为:',b2a_hex(ciphertext)[16:])print('解密后数据为:',decrypttext.decode())运行结果:密钥k为:b'thisisa16key'iv为:b'185445baf342d8ad'加密后数据为:b'eb32eef2c834bf3a46abb09b23289c28172aef70'解密后数据为:安全实验RSARSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。非对称加密典型的如RSA等,常见方法,使用openssl,keytools等工具生成一对公私钥对,使用被公钥加密的数据可以使用私钥来解密,反之亦然(被私钥加密的数据也可以被公钥解密)。在实际使用中私钥一般保存在发布者手中,是私有的不对外公开的,只将公钥对外公布,就能实现只有私钥的持有者才能将数据解密的方法。这种加密方式安全系数很高,因为它不用将解密的密钥进行传递,从而没有密钥在传递过程中被截获的风险,而破解密文几乎又是不可能的。但是算法的效率低,所以常用于很重要数据的加密,常和对称配合使用,使用非对称加密的密钥去加密对称加密的密钥。Python实现首先我们需要安装一个rsa模块:pipinstallrsa而且,因为RSA加密算法的特性,RSA的公钥私钥都是10进制的,但公钥的值常常保存为16进制的格式,所以需要将其用int()方法转换为10进制格式。importrsaimportbinascii#使用网页中获得的n和e值,将明文加密defrsa_encrypt(rsa_n,rsa_e,message):用n值和e值生成公钥key=rsa.PublicKey(rsa_n,rsa_e)用公钥把明文加密message=rsa.encrypt(message.encode(),key)转化成常用的可读性高的十六进制message=binascii.b2a_hex(messa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论