原文地址:https://program-park.github.io/2021/08/10/python_11/

需求为对文件进行加密,保留哈希,防止别人篡改文件,代码如下:

import time,re,osfrom watchdog.events import *
from watchdog.observers import Observerdef rotation_left(x, num):# 循环左移num %= 32left = (x << num) % (2 ** 32)right = (x >> (32 - num)) % (2 ** 32)result = left ^ rightreturn resultdef Int2Bin(x, k):x = str(bin(x)[2:])result = "0" * (k - len(x)) + xreturn resultclass SM3:def __init__(self):# 常量初始化self.IV = [0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600, 0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E]self.T = [0x79cc4519, 0x7a879d8a]self.maxu32 = 2 ** 32self.w1 = [0] * 68self.w2 = [0] * 64def ff(self, x, y, z, j):# 布尔函数FFresult = 0if j < 16:result = x ^ y ^ zelif j >= 16:result = (x & y) | (x & z) | (y & z)return resultdef gg(self, x, y, z, j):# 布尔函数GGresult = 0if j < 16:result = x ^ y ^ zelif j >= 16:result = (x & y) | (~x & z)return resultdef p(self, x, mode):result = 0# 置换函数P# 输入参数X的长度为32bit(=1个字)# 输入参数mode共两种取值:0和1if mode == 0:result = x ^ rotation_left(x, 9) ^ rotation_left(x, 17)elif mode == 1:result = x ^ rotation_left(x, 15) ^ rotation_left(x, 23)return resultdef sm3_fill(self, msg):# 填充消息,使其长度为512bit的整数倍# 输入参数msg为bytearray类型# 中间参数msg_new_bin为二进制string类型# 输出参数msg_new_bytes为bytearray类型length = len(msg)  # msg的长度(单位:byte)l = length * 8  # msg的长度(单位:bit)num = length // 64remain_byte = length % 64msg_remain_bin = ""msg_new_bytes = bytearray((num + 1) * 64)  ##填充后的消息长度,单位:byte# 将原数据存储至msg_new_bytes中for i in range(length):msg_new_bytes[i] = msg[i]# remain部分以二进制字符串形式存储remain_bit = remain_byte * 8  # 单位:bitfor i in range(remain_byte):msg_remain_bin += "{:08b}".format(msg[num * 64 + i])k = (448 - l - 1) % 512while k < 0:# k为满足 l + k + 1 = 448 % 512 的最小非负整数k += 512msg_remain_bin += "1" + "0" * k + Int2Bin(l, 64)for i in range(0, 64 - remain_byte):str = msg_remain_bin[i * 8 + remain_bit: (i + 1) * 8 + remain_bit]temp = length + imsg_new_bytes[temp] = int(str, 2)  # 将2进制字符串按byte为组转换为整数return msg_new_bytesdef sm3_msg_extend(self, msg):# 扩展函数: 将512bit的数据msg扩展为132个字(w1共68个字,w2共64个字)# 输入参数msg为bytearray类型,长度为512bit=64bytefor i in range(0, 16):self.w1[i] = int.from_bytes(msg[i * 4:(i + 1) * 4], byteorder="big")for i in range(16, 68):self.w1[i] = self.p(self.w1[i - 16] ^ self.w1[i - 9] ^ rotation_left(self.w1[i - 3], 15),1) ^ rotation_left(self.w1[i - 13], 7) ^ self.w1[i - 6]for i in range(64):self.w2[i] = self.w1[i] ^ self.w1[i + 4]# 测试扩展数据w1和w2# print("w1:")# for i in range(0, len(self.w1), 8):#     print(hex(self.w1[i]))# print("w2:")# for i in range(0, len(self.w2), 8):#     print(hex(self.w2[i]))def sm3_compress(self, msg):# 压缩函数# 输入参数v为初始化参数,类型为bytes/bytearray,大小为256bit# 输入参数msg为512bit的待压缩数据self.sm3_msg_extend(msg)ss1 = 0A = self.IV[0]B = self.IV[1]C = self.IV[2]D = self.IV[3]E = self.IV[4]F = self.IV[5]G = self.IV[6]H = self.IV[7]for j in range(64):if j < 16:ss1 = rotation_left((rotation_left(A, 12) + E + rotation_left(self.T[0], j)) % self.maxu32, 7)elif j >= 16:ss1 = rotation_left((rotation_left(A, 12) + E + rotation_left(self.T[1], j)) % self.maxu32, 7)ss2 = ss1 ^ rotation_left(A, 12)tt1 = (self.ff(A, B, C, j) + D + ss2 + self.w2[j]) % self.maxu32tt2 = (self.gg(E, F, G, j) + H + ss1 + self.w1[j]) % self.maxu32D = CC = rotation_left(B, 9)B = AA = tt1H = GG = rotation_left(F, 19)F = EE = self.p(tt2, 0)# 测试IV的压缩中间值# print("j= %d:" % j, hex(A)[2:], hex(B)[2:], hex(C)[2:], hex(D)[2:], hex(E)[2:], hex(F)[2:], hex(G)[2:], hex(H)[2:])self.IV[0] ^= Aself.IV[1] ^= Bself.IV[2] ^= Cself.IV[3] ^= Dself.IV[4] ^= Eself.IV[5] ^= Fself.IV[6] ^= Gself.IV[7] ^= Hdef sm3_update(self, msg):# 迭代函数# 输入参数msg为bytearray类型# msg_new为bytearray类型msg_new = self.sm3_fill(msg)  # msg_new经过填充后一定是512的整数倍n = len(msg_new) // 64  # n是整数,n>=1for i in range(0, n):self.sm3_compress(msg_new[i * 64:(i + 1) * 64])def sm3_final(self):digest_str = ""for i in range(len(self.IV)):digest_str += hex(self.IV[i])[2:]return digest_str.upper()def hashFile(self, filename):with open(filename, 'rb') as fp:contents = fp.read()self.sm3_update(bytearray(contents))return self.sm3_final()def getFileName(path):''' 获取指定目录下的所有指定后缀的文件名 '''f_list = os.listdir(path)# print f_listlist = []for i in f_list:# os.path.splitext():分离文件名与扩展名if os.path.splitext(i)[1] == '.tsidx':list.append(i)return listclass FileEventHandler(FileSystemEventHandler):def __init__(self):FileSystemEventHandler.__init__(self)def on_created(self, event):if event.is_directory:print(event.src_path)time.sleep(15)if re.compile("db_\d+_\d+_\d+").findall(event.src_path.split("/")[-1]):list = getFileName(event.src_path)for i in range(len(list)):file_digest = SM3().hashFile(event.src_path + "/" + list[i])file = open(event.src_path + "/sm3(" + str(i) + ").txt", "a")file.write(file_digest+ " " + list[i] + "\n")file.close()if __name__ == "__main__":observer = Observer()event_handler = FileEventHandler()observer.schedule(event_handler, "/tmp", True)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()

代码中借鉴了https://blog.csdn.net/weixin_43936250/article/details/105543266的sm3加密,和https://blog.csdn.net/jerry_liufeng/article/details/109603462的目录实时监控

python脚本之对文件进行哈希校验相关推荐

  1. python图标的演变_把Python脚本生成exe文件并添加版本信息和自定义图标

    pyinstaller和py2exe把Python脚本生成exe文件,并添加版本信息和自定义图标. 写了一个查找产品通道号的小程序,目前还没进行异常处理. 以下是程序源码. # -*- coding: ...

  2. python 脚本转exe文件

    python 脚本转exe文件 # 下载pyinstaller pip3 install pyinstallerpyinstaller -F main.py -n 转XXX小工具 --noconsol ...

  3. 利用python脚本程序监控文件被修改

    需求: 利用python编写监控程序,监控一个文件目录,当目录下的文件发生改变时,实现有修改就发报警邮件 邮件使用QQ邮箱,需要开启smtp,使用手机发生短信,腾讯会给你发邮箱密码.如下所示: 把这个 ...

  4. 清除python shell中的内容_如何使用python脚本定时清空文件内容?

    我们一直在对大家强调关于python脚本的使用,但是有部分同学提出疑问,就是关于上期跟大家说的shell脚本没有实质性的使用效果,如果在实际应用里,要怎么使用这个脚本,它又能实现什么效果,其实针对这个 ...

  5. python脚本转lua_初次使用Python脚本,proto协议文件转Lua代码

    使用IntelliJ IDEA编辑器编写Lua脚本的时候,安装一个插件 "EmmyLua" 可以对有代码提示功能 想把protoBuf协议文件转成Lua代码,然后给出代码提示 第一 ...

  6. cmd运行python脚本处理其他文件_如何在cmd命令行里运行python脚本

    在电脑安装好python软件之后即可通过cmd命令行运行python脚本文件.不过有些小伙伴不懂,今天小编我就来说一下cmd命令行如何运行python脚本文件. 工具/原料 电脑 python 3 方 ...

  7. python脚本修改hosts文件

    记一次使用python脚本来修改hosts文件,由于公司服务器需要换ip地址,服务器里都是Linux系统,而hosts文件中有些解析的ip,手动一台一台的解析太麻烦,就写了这个脚本.本来以为感觉很简单 ...

  8. python脚本将json文件生成C语言结构体

    1.引言 以前用过python脚本根据excel生成相关C语言代码,其实本质就是文件的读写,主要是逻辑问题,这次尝试将json文件生成C语言的结构体. 2.代码 这是一个json文件,生成这个结构体的 ...

  9. 用PYTHON脚本拆分M3U文件

    M3U文件是播放列表文件,里面记录的是一条一条的音频或视频资源地址. 最近从网上收集了一些在线电视的资源列表,这M3U文件的形式,但这个列表长度达到1000多项内容. 而且这里面包含了太多已经失效的资 ...

  10. 使用Python脚本读取fasta文件

    读取FASTA文件 使用pip下载biopython pip.exe install biopython import sys from Bio import SeqIO sys.path #检查模块 ...

最新文章

  1. linux 交叉编译选项
  2. java Interface
  3. Python-OpenCV 处理图像(八):图像二值化处理
  4. poj 3797(状态压缩dp)
  5. 2021.NET Conf China上的GraphQL
  6. C++描述杭电OJ 2012.素数判定 ||
  7. 内向的人可以做产品经理吗?
  8. Java面试题--HashMap是什么?
  9. 紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题[含答案解析]...
  10. NYOJ-非洲小孩(贪心)
  11. SQL的简单增、删、改
  12. 用计算机唱歌 丑八怪乐谱,抖音计算机乐谱有哪些?计算机歌曲乐谱汇总
  13. imei服务器清除id_苹果绕过ID解锁
  14. Hi3559A Hi3519A Hi3556A算力对比
  15. shell脚本shc加密解密
  16. noip2018提高组广东省成绩
  17. cityengine常用规则函数
  18. MAC打印出现Filter failed
  19. 语法错误与语义错误(所有语言通用版)
  20. 非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc)

热门文章

  1. Yolo系列 | Yolov4v5的模型结构与正负样本匹配
  2. 当前的安全设置不允许从该位置下载文件--解决方法
  3. html文字竖排垂直居中显示,CSS文字竖排效果且垂直居中水平居中
  4. 光盘在服务器上装系统,如何通过DELL引导光盘在戴尔11G服务器上安装Win2003操作系统?.docx...
  5. LaTeX 数学公式及符号
  6. 使用medusa进行ssh爆破
  7. 配置网络拓扑图测试软件,网络工程师必备系列课程专题(数据恢复+RAID配置+画拓扑图)...
  8. 钢铁厂计算机相关岗位需要倒班吗,钢铁厂车间倒班,听听他们的心声!
  9. 面试问题总结——关于YOLO系列(三)
  10. java math 最大值_java 中Math 的常用方法