基于sha1的BS架构的文件校验系统

编程语言:python
框架:flask
相关技术:python、flask、网络通信、SHA1加密解密算法、HTML、javascript、css
软件包括客户端和服务器端,客户端实现文件 Hash 值计算,服务器端接收 的文件和 Hash 值,进行文件完整性验证。
软件具体功能如下:
(1) 客户端文件 Hash 的计算
a)输入任意文件格式的文件
b)采用 Hash 算法计算 Hash 值,并十六进制显示 hash 值,然后把文件和 hash 值给服务器端
(2) 服务器端验证文件的完整性
a)接收端客户端文件和 Hash 值,然后分离得到文件和收到 Hash 值,然后 采用跟客户端一样 Hash 函数计算文件 Hash 值,计算 Hash 值与收到 Hash 比 较,若一致,则文件完整性认证通过,若不一致,则文件完整性验证不通过; 其它要求:
(1)用函数实现 Hash 算法
(2)可选择 C、C++、Java、Python 等任意一种编程语言实现;

在这里插入图片描述
核心代码:

import struct

from flask import Flask, request, render_template
import requests

# 定义 SHA1 算法需要用到的常量和函数
H0 = 0x67452301  # 初始化变量 H0
H1 = 0xEFCDAB89  # 初始化变量 H1
H2 = 0x98BADCFE  # 初始化变量 H2
H3 = 0x10325476  # 初始化变量 H3
H4 = 0xC3D2E1F0  # 初始化变量 H4

# 定义一个函数,用于将二进制数左移 b 位或右移 32-b 位,并将结果与 0xffffffff 进行与运算,保证结果为 32 位无符号整数
def left_rotate(n, b):
    return ((n << b) | (n >> (32 - b))) & 0xffffffff

# 定义一个函数,用于计算给定消息的 SHA1 哈希值
def sha1(message):
    # 计算消息长度和填充长度
    message_len = len(message)
    pad_len = 64 - ((message_len + 8) % 64)
    if pad_len == 0:
        pad_len = 64
    # 对消息进行填充,使其长度为 64 的倍数
    message += b'\x80' + (b'\x00' * (pad_len - 1))
    # 将消息长度添加到消息末尾,以 64 位大端序的形式表示
    message_bit_len = message_len * 8
    message += struct.pack('>Q', message_bit_len)

    # 初始化变量 A、B、C、D、E
    a, b, c, d, e = H0, H1, H2, H3, H4

    # 对消息进行分组,每组 64 字节,共 80 组
    for i in range(0, len(message), 64):
        chunk = message[i:i+64]  # 获取一组 64 字节的消息
        w = list(struct.unpack('>16L', chunk))  # 将每组消息划分为 16 个 32 位大端序的字
        # 对每组消息进行扩展,得到 80 个 32 位大端序的字
        for j in range(16, 80):
            w.append(left_rotate(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1))
        a_, b_, c_, d_, e_ = a, b, c, d, e
        # 对每组消息进行计算
        for j in range(80):
            if j < 20:
                f = (b & c) | ((~b) & d)
                k = 0x5A827999
            elif j < 40:
                f = b ^ c ^ d
                k = 0x6ED9EBA1
            elif j < 60:
                f = (b & c) | (b & d) | (c & d)
                k = 0x8F1BBCDC
            else:
                f = b ^ c ^ d
                k = 0xCA62C1D6
            temp = (left_rotate(a, 5) + f + e + k + w[j]) & 0xffffffff
            e = d
            d = c
            c = left_rotate(b, 30)
            b = a
            a = temp
        a = (a + a_) & 0xffffffff
        b = (b + b_) & 0xffffffff
        c = (c + c_) & 0xffffffff
        d = (d + d_) & 0xffffffff
        e = (e + e_) & 0xffffffff
    # 将计算结果以 16 进制字符串的形式返回
    return '{:08x}{:08x}{:08x}{:08x}{:08x}'.format(a, b, c, d, e)


app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    responses=[]  # 定义一个列表,用于存储响应消息
    responses.append("运行地址:127.0.0.1   运行端口:5000")  # 添加一条响应消息
    if request.method == 'POST':
        file = request.files.get('file')  # 获取上传的文件
        if not file:
            return render_template('index.html', message='请选择你的文件:', message_class='error')
        hash = sha1(file.read())  # 计算文件的 SHA1 哈希值
        file.seek(0)  # 将文件指针重置到文件开头
        file_content = file.read(100)  # 读取文件的前 100 字节内容
        responses.append("文件内容的前一百字节为(防止文件过大)):"+file_content.decode())  # 添加一条响应消息
        responses.append("正在计算客户端文件的sha1哈希值......")  # 添加一条响应消息
        responses.append("客户端的文件哈希值为:"+hash)  # 添加一条响应消息
        file.seek(0)  # 将文件指针移回开头
        response = requests.post('http://localhost:8001/app1', data={'hash': hash}, files={'file': file})  # 向服务器发送请求,传递文件哈希值和文件内容
        if response.status_code == 200:
            result = response.json()
            message = result['message']
            responses.append("正在计算服务器端文件的sha1哈希值......")  # 添加一条响应消息
            responses.append("服务器的文件哈希值为:" + hash)  # 添加一条响应消息
            responses.append(message)  # 添加一条响应消息
            message_class = 'success' if result['match'] else 'error'  # 根据比对结果确定响应消息的类型
        else:
            message = '连接服务器失败!'
            message_class = 'error'
        return render_template('index.html', message=message, message_class=message_class,responses=responses)  # 渲染模板并返回响应
    else:
        return render_template('index.html')  # 渲染模板并返回响应

if __name__ == '__main__':
    app.run()  # 启动应用程序

实现效果:
在这里插入图片描述
在这里插入图片描述

全部代码打包存放在压缩包,需要的自取:
链接: https://pan.baidu.com/s/1fgAFGGLQzh1uJiNraeSRjw?pwd=hb4c 提取码: hb4c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是木子呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值