使用MAC进行消息传输时完整性和真实性的验证
以下通过socket网络编程实现。
客户端:
import hmac
import socket
def mac(key,message):#HMAC函数,即生成消息认证码
key=key.encode()
plain_bytes = message.encode()
mac_op = hmac.new(key, digestmod='MD5')
mac_op.update(plain_bytes)
hex_str = mac_op.hexdigest()
return hex_str#返回十六进制值
#------------------------------------------------
#通过使用socket网络编程来进行消息完整性和真实性认证
#本页面为客户端
#------------------------------------------------
'''
注:本实验为实现MAC消息完整性和真实性认证,故注意以下因素:
1.双方在MAC上所使用的密钥key为10(可设定)位由服务器随机生成并发给客户端
2.不考虑双方所共享MAC的密钥key在网络中传输的安全性
3.不考虑双方所发送消息在网络传输中被窃取和窃听的安全性
4.不考虑客户端与服务器端的互相通信,只做客户端向服务器发送消息的部分
'''
def tcp(x,y):#x为发送消息目标的地址,y是发送的消息
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP套接字
s.connect((x, 8000))
data = s.recv(1024) # 设定一次可以接收1024字节大小
key = data.decode() # 传过来的字节流需要用decode()解码
print("已接收共享密钥为:",key)
s.send(y.encode())
print("已发送消息")
macy=mac(key,y)#获取消息的消息认证码
s.send(macy.encode())
print("已发送消息认证码: ",macy)
data = s.recv(1024) # 设定一次可以接收1024字节大小
tag = data.decode() # 传过来的字节流需要用decode()解码
print(tag)
print("输入服务器ip:")
x=input()
print("请输入消息:")
y=input()
tcp(x,y)
服务器端
import hmac
import random
import socket
from tkinter import *
import string
def mac(key,message):#HMAC函数,即生成消息认证码
key=key.encode()
plain_bytes = message.encode()
mac_op = hmac.new(key, digestmod='MD5')
mac_op.update(plain_bytes)
hex_str = mac_op.hexdigest()
return hex_str #返回十六进制值
def randomkey(a):
#生成长度为a的随机字符序列
b = random.sample(string.ascii_letters, a)
return b
#------------------------------------------------
#通过使用socket网络编程来进行消息完整性和真实性认证
#本页面为服务器端
#------------------------------------------------
'''
注:本实验为实现MAC消息完整性和真实性认证,故注意以下因素:
1.双方在MAC上所使用的密钥key为10(可设定)位由服务器随机生成并发给客户端
2.不考虑双方所共享MAC的密钥key在网络中传输的安全性
3.不考虑双方所发送消息在网络传输中被窃取和窃听的安全性
4.不考虑客户端与服务器端的互相通信,只做客户端向服务器发送消息的部分
'''
# 1创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 必须和客户端保持一致
# 2,需要自己绑定一个ip地址和端口号
s.bind(('0.0.0.0', 8000))
# 3,服务端监听操作时刻注意是否有客户端请求发来
s.listen(1) # 可以同时监听3个,但是这里只有一个客户请求,因为没有写多线程
# 4,同意连接请求
while TRUE:
print("服务器启动,服务器等待被连接中。。。。。。")
s1, addr = s.accept() # s1是服务端的socket对象s是接入的客户端socket对象
print('链接地址:%s' % str(addr))
key = ''.join(randomkey(10))#设定密钥长度为10
print("双方的共享密钥为:",key)
s1.send(key.encode())
print("已发送共享密钥。")
data = s1.recv(1024) # 设定一次可以接收1024字节大小
massage = data.decode() # 传过来的字节流需要用decode()解码
print("已接收消息:",massage)
data = s1.recv(1024) # 设定一次可以接收1024字节大小
macy1 = data.decode() # 传过来的字节流需要用decode()解码
print("已接收消息认证码:",macy1)
macy2 = mac(key,massage)
tag1="消息完整且消息真实,结束。"
tag2="消息出现错误,请重发。"
if macy1==macy2 :
print(tag1)
s1.send(tag1.encode())
else:
print(tag2)
s1.send(tag2.encode())
南理工 2021/3/20
网安 勿撞车