2018年7月21日python中的加密和解密

·在函数调用执行过程中:
如果出现return,return中的函数执行完则本函数就运行结束,return下面的语句不会再继续执行,所以return使
用时也应该注意,如果是调用函数的下面还有要输出的东西,可以不用写return,直接写函数名调用

·在函数中的最后如果有返回值return True,他的位置一定要注意,不要放在for循环里面,否则循环只能执行1次,
要和for循环在同一个竖线上。

·字母的变大upper(),变小lower(),和加密encrypt(src)都不能放在开头,会报错,可以放在中间要么就另起一行
重新赋值

**********************************************
·编码:将计算机中的字符串按照一定的顺序表示成二进制数据的过程

·
二进制:0/1   每一个二进制数字,表示一位,通常计算机中:0000 0001
字节:        8位二进制数据表示一个字节: 0000 0001->1个字节
字符:        2个字节->1个字符;通常情况下我们使用的字符串~就是使用字符编码的!


·各种计算机编码方式的历史:
计算机-> 表示[英文字母、数字、部分特殊符号]-> 最初是ascii编码[0~256] A:65  a:97
周边国家-> 表示[英文字母、数字、特殊符号、其他相似语言]-> ANSI
最后使用国家扩展-> 为了要表示更多的语言和数据-> 扩展了ANSI编码
天朝-> 引入计算机-> 表示汉字-> 国家标准编码 -> GB2312-> GBK -> GB18030


 ·一般的编码方式都是:
一个字节表示一个英文字母、数字、特殊符号等等
两个字节表示一个汉字-> 字符(两个字节)

·UTF-8的由来:
最后推出了一种新编码:万国码,统一字符编码[号称可以统一全球范围内任何语言的表示方式]
任何语言中的任何数据,都可以使用一个字符来表示,也就是unicode编码
互联网开始兴起->网络上传输数据!数据信息开始共享,数据->在网线上传递->电流[数据包]
必须按照按照固定的编码进行传输,接收方按照固定的编码进行解码才能得到正确数据
这是数据传输编码:unicode transfer format 8 bit [UTF-8]

·python中,怎么完成字符串的编码和解码?
要命的规则:字符串的编码解码,一直都是任何语言中一个难点和重点
任何字符串->都是由字节组成的!

python3中:字符:(str);字节(bytes)
字符->字节:encode 编码:将一个字符串编码成计算机可以操作的二进制数据
字节->字符:decode 解码:将一个二进制数据按照指定的编码~解码成自然数据

s = “大天朝”            s:<class ‘str’>
x = s.encode(“utf-8”)   x:<class ‘bytes’>
x-> b’\xb9\x00\xa5..’

x2 = x.decode(“utf-8”)  x2:<class ‘str’>
x2 -> “大天朝”

***************************************
·字符串的替换操作:
简单替换:使用最多的操作方式:replace
S.replace(old, new [, count])
    S:表示用户自己定义的一个字符串
    old:第一个参数:用来查询的需要被替换的字符串
    new:第二个参数:用来替换查询到的数据的字符串
    count:文档中如果有方括号[]表示可选,可以有也可以没有,表示替换的个数
    count不规定的情况下就是默认情况全部替换,如果指定了count是指从头开始替换的旧数据的个数

s = “hello world”
x = s.replace(‘l’, ‘*’)
x-> “he**o wor*d”
s-> “hello world”     因为s是字符串,属于基本数据类型,所以s本来的值是不变的

复杂的替换:
s1=“abcdefg”            #先定义对应替换的关系
s2=“HIGKLMN”
s=str.maketrans(s1,s2)    #再定义一个映射
x="guojia"                #给出一个将要替换的字符串
s3=x.translate(s)         #以映射关系s对字符串x进行替换

****************************************************
·加密解密操作:
加密又分为单向加密和双向加密,单向加密后的密文无法还原,双向加密后的密文可以还原,,
单向加密中最常用的是MD5和sha,双向加密又分为对称加密和非对称加密
加密:将一个明文数据,按照指定的算法,运算得到一个其他的可以隐藏真实信息的密文数据,
这个过程称为加密;处理的算法称为加密算法;用到的关键数据称为密钥
解密:按照指定的算法和关键数据,将一个密文数据进行逆向运算得到正确的明文数据的过程成为解密操作

·python中的加密操作:
hashlib是一个拥有多种加密算法的单向加密模块,如果想要查看里面都有哪些加密算法,需要先用import引用这个模块
然后用dir(hashlib)查看里面所有的加密算法,如md5和sha

单向加密算法有两种:
只能加密,不能解密的算法
如:用户账号密码(单向加密)存储,此时任何人都不能查看该用户的明文密码
流程->用户输入明文密码->加密->和存储的密文密码进行比较->相等-成功
1.单向散列加密算法-> MD5加密     #是一个比较经典的加密算法,又称为数据的数字指纹(一般大型软件都会提供一个
2.单向哈希加密算法-> SHAX加密         #MD5值,当软件下载完成之后和提供的MD5值对照一个,如果一样就没问题,
                                        #如果不一样就说明你丢数据了

#单项散列加密算法使用之前必须要先用import引用hashlib模块
·单向散列算法的操作步骤:
获取明文数据            s = “hello”
明文数据转换成字节数据        s = s.encode(“utf-8”)
进行加密处理             x = hashlib.md5(s)
进行盐值混淆            x.update("^#@JDDf".encode("utf-8"))   
得到密文数据            x.hexdigest()   #得到最后的加密数据                
……                ->‘ba65a656f6b12312ab12d23’   
加密过程不可逆!
 #盐值混淆的目的是加入不同的盐值使相同的密码得到不同的密文,更加安全
 #md5的密文数据是一个十六进制的字符串,无论原数据多少,加密后的密文长度固定


·单向哈希算法的操作步骤:
获取明文数据            s = “hello”
明文数据转换成字节数据        s = s.encode(“utf-8”)
进行加密处理             x = hashlib.sha224(s)
得到密文数据            x.hexdigest()                         
……                ->‘ba65a656f6b12312ab12d23’   
加密过程不可逆                                                   
                                                              
#sha有很多类型,不同类型得到的密文长度不一样但是使用同一种sha加密数据,无论数据多大加
密出来的密文长度一样,sha后边的数字是象征着加
密后的密文长度,数字越大,加密出来的密文长度越长


·出错类型:
AttributeError: '_hashlib.HASH' object has no attribute 'hesdigest'
归属问题,一般都是打错字母导致,说的是输入的"hesdigest"这个东西并不不属于前面那个模块

************************************************
·双向加密算法:
可以加密,加密的数据可以解密得到明文数据
使用在更多的场景;数据进行加密传输->目标地址->解密得到明文数据进行处理,双向加密又分为对称加密和非对称加密
对称加密:加密和解密使用相同的秘钥;
非对称加密:加密和解密使用不同的秘钥;如HTTPS传输数据

·Base64是python内置的一个双向的对称加密中的编码解码,一般不说用于加密,更多的是说编码解码(base64也称为python内置的一个标准库):
文档中如果有(standand library)是python内置的标准库,可以直接使用
如果想要查看Base64模块中的函数,必须要先用import引用这个模块才能用dir查看
Base64是一种用64个字符来表示任意二进制数据的方法。
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多文本文件软件无法显示
和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。
Base64是一种最常见的二进制编码方法
Base64编码解码操作步骤,加密:
s="hello world"
s=s.encode("utf-8")          #将字符串转换为字节类型数据的编码方式可以换成其他的如"gb2312",这个没有限制
x=base64.b64encode(s)        #也可以把上面那一句整合了x=base64.b64encode(s.encode("utf-8"))
x
b'5rw357gioogig56'

解密过程:
y=base64.b64decode(x)
y=y.decode("utf-8")
y
"hello world"

base64加解密过程小结:
src = “明文数据”
tgt = base64.b64encode(src.encode(‘UTF-8’))       #编码->like 加密

src = base64.b64decode(tgt).decode(“utf-8”)       #解码,解密      
base64一般不说加密解密,因为它相对于MD5和hash算法来说比较简单,一般说base64是编码解码,
base64模块中也有很多种加密方法,如b64,b32,后边的数字越小加密后密文长度越长,而且选择任何一种加密方法
加密过后东西长度不固定,数据越长,加密过后的密文越长。

**********************************
pycharm中鼠标有两种模式:
插入模式:把输入的代码插到光标处,后面的向后移动。
改写模式:是把当前的字替换成新输入的。编辑代码一般是用插入模式。 
模式的转换组合键为外接键盘ins,   笔记本shift+0

pycharm中的规范:
声明模块和定义的函数之间空两行
定义函数的时候,函数与函数之间空两行,如果出现灰色的波浪线,并不是报错,而是书写的代码不规范


发表一篇文章的过程:
先定义一个发表文章的功能函数:article_publish()
再定义一个发表文章之后的显示页面函数  show_article_single(title)
还要定义一个根据一个标题就能查到那篇文章的功能函数   article_check_single(title)

查看多篇文章的过程:
先定义一个遍历所有文章的功能函数   article_check_all()
再定义一个显示所有文章的页面函数   show_article_list(*articles)
在该页面函数中有一个查看单篇文章的功能函数 show_article_single(title) 

查看个人文章的过程:
先定义一个查找个人文章的功能函数   check_article_self()
再调用显示所有文章的页面函数    show_article_list(*articles)  

猜你喜欢

转载自blog.csdn.net/qq_40994972/article/details/81150104