使用MAC对消息的真实性和完整性进行认证

使用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
                                                                                     网安     勿撞车
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值