python通过字符串调用方法_python调用shell脚本

python通过字符串调用方法_python调用shell脚本需求为对文件进行加密,保留哈希,防止别人篡改文件,代码如下:importtime,re,osfromwatchdog.eventsimport*fromwatchdog.observersimportObserverdefrotation_left(x,num):#循环左移num%=32left=(x<<num)%(2**32)right=(x>>(32-num))%(2**

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

import time,re,os

from watchdog.events import *
from watchdog.observers import Observer

def rotation_left(x, num):
    # 循环左移
    num %= 32
    left = (x << num) % (2 ** 32)
    right = (x >> (32 - num)) % (2 ** 32)
    result = left ^ right
    return result

def Int2Bin(x, k):
    x = str(bin(x)[2:])
    result = "0" * (k - len(x)) + x
    return result

class SM3:

    def __init__(self):
        # 常量初始化
        self.IV = [0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600, 0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E]
        self.T = [0x79cc4519, 0x7a879d8a]
        self.maxu32 = 2 ** 32
        self.w1 = [0] * 68
        self.w2 = [0] * 64

    def ff(self, x, y, z, j):
        # 布尔函数FF
        result = 0
        if j < 16:
            result = x ^ y ^ z
        elif j >= 16:
            result = (x & y) | (x & z) | (y & z)
        return result

    def gg(self, x, y, z, j):
        # 布尔函数GG
        result = 0
        if j < 16:
            result = x ^ y ^ z
        elif j >= 16:
            result = (x & y) | (~x & z)
        return result

    def p(self, x, mode):
        result = 0
        # 置换函数P
        # 输入参数X的长度为32bit(=1个字)
        # 输入参数mode共两种取值:0和1
        if 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 result

    def 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 // 64
        remain_byte = length % 64
        msg_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  # 单位:bit
        for i in range(remain_byte):
            msg_remain_bin += "{:08b}".format(msg[num * 64 + i])

        k = (448 - l - 1) % 512
        while k < 0:
            # k为满足 l + k + 1 = 448 % 512 的最小非负整数
            k += 512

        msg_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 + i
            msg_new_bytes[temp] = int(str, 2)  # 将2进制字符串按byte为组转换为整数
        return msg_new_bytes

    def sm3_msg_extend(self, msg):
        # 扩展函数: 将512bit的数据msg扩展为132个字(w1共68个字,w2共64个字)
        # 输入参数msg为bytearray类型,长度为512bit=64byte
        for 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 = 0

        A = 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.maxu32
            tt2 = (self.gg(E, F, G, j) + H + ss1 + self.w1[j]) % self.maxu32
            D = C
            C = rotation_left(B, 9)
            B = A
            A = tt1
            H = G
            G = rotation_left(F, 19)
            F = E
            E = 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] ^= A
        self.IV[1] ^= B
        self.IV[2] ^= C
        self.IV[3] ^= D
        self.IV[4] ^= E
        self.IV[5] ^= F
        self.IV[6] ^= G
        self.IV[7] ^= H

    def 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>=1

        for 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_list
    list = []
    for i in f_list:
        # os.path.splitext():分离文件名与扩展名
        if os.path.splitext(i)[1] == '.tsidx':
            list.append(i)
    return list

class 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的目录实时监控

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194551.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月3日 下午5:43
下一篇 2025年11月3日 下午6:15


相关推荐

  • fullCalendar插件的使用简单教程

    fullCalendar插件的使用简单教程最近项目中想实现一个基于日历的事件提醒 百度众多资源后选定使用 fullCalendar 进行实现 那首先来说下 fullCalendar 的官网 https fullcalendar io 在这上面有简单的 demo 以及 API 但是是英文的 那么英文不太好的朋友可以选择翻译或者来看这个中文版的 API http www jb51 net article 104841 htm 相对于官网的 API 这个

    2026年3月19日
    1
  • luajit vs php7,Luajit编译

    luajit vs php7,Luajit编译2、找到VC编译命令行,以VS2019为例,分别位于C:\ProgramData\Microsoft\Windows\StartMenu\Programs\VisualStudio019\VisualStudioTools\VC\x64NativeToolsCommandPromptforVS2019C:\ProgramData\Microsoft\Windows\Star…

    2026年4月15日
    7
  • MySQL安装配置教程(超级详细、保姆级)

    MySQL安装配置教程(超级详细、保姆级)一、下载MySQLMysql官网下载地址https://downloads.mysql.com/archives/installer/1.选择想要安装的版本,本篇文章选择的是5.7.31版本,下面的那个文件,点击Download下载二、安装MySQL1.选择设置类型双击运行mysql-installer-community-5.7.31.0.msi这里选择是自定义安装,所以直接选择“Custom”,点击“Next”“DeveloperDefault”是开发者默认

    2022年5月31日
    44
  • linux收发邮件_python邮件发送

    linux收发邮件_python邮件发送linux邮件传输一般用在特定的网络环境下,记住,只要有网络,就能办事;闲话少扯,直接上干货:步骤1邮箱设置开启STMP服务,开启后会收到STMP授权码。多种邮箱都有这个功能,申请后把你的授权码记住了。步骤2linux命令:/etc/mail.rc配置邮件发送参数将以下数据加到最下面(如下图):#邮箱setfrom=843903492@qq.com#默…

    2022年10月20日
    5
  • 在黑群辉nas中搭建Emby Server的步骤

    在黑群辉nas中搭建Emby Server的步骤参考 ytb 的视频 https www youtube com watch v G7zRogHZSX81 下载 emby 在群辉中的各种版本 在黑裙 6 i5cpu7200U 的配置中使用的版本是 EmbyServer 3 5 3 0 18 broadwell spk 具体版本已存我的百度网盘 2 进入群辉 点击套件 手动添加 上传本地的 spk 文件 3 上传完成 打开 emby 完成基本的媒体库服务器配置

    2026年3月17日
    2
  • C++容器和迭代器

    C++容器和迭代器一 顺序容器 vector1 1 容器是什么在 C 中 容器被定义为 在数据存储上 有一种对象类型 它可以持有其他对象或指向其他对象的指针 这种对象类型就叫做容器 简单理解 即容器就是保存其他对象的对象 而且 这种 对象 还有处理 其他对象 的方法 容器是随着面向对象语言的诞生而提出的 它甚至被认为是早期面向对象语言的基础 现在几乎所有面向对象语言中都伴随着一

    2025年9月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号