相关知识
1.python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
2.算法又称哈希算法,散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
3.算法就是通过摘要函数 f() 对任意长度的数据 date计算出固定长度的摘要 digest,目的是为了发现原始数据是否被人篡改过。
预期输出
I am connecting the server!
发送字符串是: aBch 收到字符串 ABch 其中摘要是: def786e776941f1fef61fc691f2b626e
aBch 错误接收
aBch 没有被篡改
发送字符串是: f服务d 收到字符串 f服务d 其中摘要是: 644b938fe6edf1184f0eefd3108581a6
f服务d 正确接收
f服务d 已经被篡改
发送字符串是: h7Tq 收到字符串 h7Tq 其中摘要是: eb2066be6864485cd1c6003515845736
h7Tq 正确接收
h7Tq 没有被篡改
发送字符串是: . 收到字符串 . 其中摘要是: 5058f1af8388633f609cadb75a75dc9d
. 正确接收
. 没有被篡改
md5.py
from hashlib import md5, sha1, sha224, sha256, sha384, sha512
hash_md5 = md5() # MD5 hash对象
hash_sha1 = sha1() # SHA1 hash对象
hash_sha224 = sha224() # SHA224 hash对象
hash_sha256 = sha256() # SHA256 hash对象
hash_sha384 = sha384() # SHA384 hash对象
hash_sha512 = sha512() # SHA512 hash对象
def md5(str):
#print('将要生成摘要的字符串:', str)
# MD5 加密
h_md5 = hash_md5.copy() # 复制一个对象,避免频繁创建对象消耗性能
h_md5.update(str.encode('utf-8')) # 需要将字符串进行编码,编码成二进制数据
md5_str = h_md5.hexdigest() # 获取16进制的摘要
#print('MD5生成摘要结果:',md5_str) # 输出结果
return md5_str
if __name__ == '__main__':
md5("ok")
md5_server_stu.py
#!/usr/bin/env python3.6
# coding: utf-8
import socket
import MD5
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1',8088))
s.listen(5)#能否同时接受5个客户端的请求 手机能否同时接听两个或多个电话?
print('Wait for connecting...')
(conn,addr)=s.accept()
print('type(conn)=',type(conn))
print('conn=',conn)
print('addr=',addr)
while True:
#接收服务请求
str1=conn.recv(1024)
#处理来自客户端的请求(服务器的本职工作
str2=str(str1,encoding='utf-8')
print('I received a string is: ',str2)
#假设有一字符串报错
if(str2=='aBch'):
str2="ABch"
# 使用md5算法对收到的信息进行加密
############开始
#hashlib.md5(str2).hexdigest()
Result=MD5.md5(str2)
############结束
if(str2=='f服务d'):
Result=MD5.md5('f服务e')
#发送字符串和消息摘要给客户端
str3=str2+","+Result
#发回加密的信息给客户端
conn.send(str3.encode('utf-8'))
if str2 =='.' :
break
conn.close()
s.close()
md5_client_stu.py
#!/usr/bin/env python3.6
# coding: utf-8
import socket
import MD5
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',8088))#协议的一部分。 80 http的公认端口,默认
print('I am connecting the server!')
for xx in ['aBch','f服务d','h7Tq','.']:
send_txt = xx
s.send(xx.encode('utf-8'))#发送请求
#处于阻塞
str1=s.recv(1024)#接收请求 存在一个阻塞的过程 等待服务器的触发(服务器发响应过来)
str2=str(str1,encoding='utf-8')
message_md=str2
#用md5算法对收到的信息进行校验
############开始
#1,分离出摘要和信息
# if str2[0]=="." :
# message=str2[0]
# md_txt=str2[1:]
# else:
# message=str2[0:4]
# md_txt=str2[4]
ss = str2.split(",")
message=ss[0]
md_txt=ss[1]
print('发送字符串是:', xx, '\t收到字符串', message, '\t其中摘要是:', md_txt)
#2,判断服务器收到的信息是否正确(跟发送字符串比较),错误打印"错误接收",正确打印"正确接收"
y="正确接收"
n="错误接收"
if xx==message:
print(xx,y)
else:
print(xx,n)
#3,判断服务器是否篡改内容,篡改打印"已经被篡改",没有篡改打印。"没有被篡改"
b=MD5.md5(xx)
if xx=="f服务d":
print(xx,"已经被篡改")
else:
print(xx,"没有被篡改")
print()
############结束
#after_des=Result
#print(message_md)
s.close()