SHA256
是一种广泛使用的密码散列函数,用于生成数据的唯一指纹,即散列值。它属于SHA-2
家族,该家族还包括 SHA-384
和 SHA-512
算法。SHA256 算法在许多领域都有应用,例如:
- 数据完整性验证:用于验证数据在传输或存储过程中是否被篡改。例如,在下载软件时,通常会提供软件的 SHA256 哈希值,用户下载后可以计算本地文件的哈希值并与提供的进行比较,如果相同,则说明数据完整未被篡改。
- 数字签名:与数字证书结合,确保消息的来源和完整性。
- 密码存储:在存储用户密码时,通常不会直接存储明文密码,而是存储密码的 SHA256 哈希值。当用户登录时,再次计算输入密码的哈
SHA256 算法原理
SHA256 算法基于一种称为碰撞攻击的原理,即试图找到两个不同的输入值,它们产生相同的散列值。SHA256 算法通过以下步骤生成散列值:
- 预处理: 将输入数据填充到 512 位的块中,并添加一个 64 位的长度字段。
- 初始化哈希值: 定义一个 256 位的初始哈希值,称为“工作变量”。
- 处理每个块: 将数据块分成 512 位的块,并对每个块进行以下步骤:
- 初始值: 定义四个 32 位的初始值,称为“圆周率”。
- 消息扩展: 将 512 位的数据块扩展为 1600 位的消息扩展。
- 压缩函数: 使用压缩函数对消息扩展和初始值进行 64 轮迭代,生成新的哈希值。
- 输出: 将最终哈希值输出为 256 位的散列值。
SHA256 算法特点
- 不可逆: 无法从散列值反推出原始数据。
- 抗碰撞: 很难找到两个不同的输入值,它们产生相同的散列值。
- 固定长度: 生成固定长度的散列值,即 256 位。
- 高效: 计算速度快,适用于处理大量数据。
SHA256 算法应用示例
- 密码学: 生成文件或消息的散列值,用于验证数据的完整性。
- 数字签名: 使用私钥对消息的散列值进行签名,使用公钥可以验证签名的有效性。
- 数据完整性: 验证数据是否在传输过程中被篡改,例如在区块链中验证交易。
- 数据加密: 与其他算法结合,例如对称加密算法,用于加密数据。
- 哈希表: 用于快速查找数据,例如在数据库中查找数据。
Python实现SHA256算法代码
import os
import hashlib
from tkinter import filedialog
import tkinter as tk
def encrypt_file(file_path):
# 读取文件内容
with open(file_path, 'rb') as file:
content = file.read()
# 使用SHA-512算法进行加密
encrypted_content = hashlib.sha512(content).digest()
# 修改文件后缀名为".goto4"
new_file_path = file_path + '.goto4'
# 覆盖源文件
with open(new_file_path, 'wb') as file:
file.write(encrypted_content)
# 删除原文件
os.remove(file_path)
def encrypt_folder(folder_path):
# 遍历文件夹中的所有文件和子文件夹
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
encrypt_file(file_path)
def select_folder():
root = tk.Tk()
root.iconbitmap('mp4/favicon.ico')
root.withdraw() # 隐藏主窗口
folder_path = filedialog.askdirectory()
if folder_path:
encrypt_folder(folder_path)
print("加密完成!")
else:
print("未选择文件夹")
if __name__ == '__main__':
select_folder()
代码分析
该程序用于对指定文件夹及其子文件夹中的所有文件进行加密。加密采用 SHA-512 算法,并将加密后的文件覆盖原文件,同时删除原文件,修改文件后缀名为 .goto4
。
代码原理:
- 程序首先定义了一个
encrypt_file
函数,用于读取文件的二进制内容,使用 SHA-512 算法对内容进行加密,生成加密后的内容。然后创建一个新的文件路径,将加密后的内容写入新文件,最后删除原文件。 - 接着定义了
encrypt_folder
函数,通过os.walk
遍历指定文件夹及其子文件夹中的所有文件,对每个文件调用encrypt_file
函数进行加密处理。 select_folder
函数使用tkinter
的filedialog
模块获取用户选择的文件夹路径,如果获取到有效的文件夹路径,则调用encrypt_folder
函数进行加密处理,否则提示未选择文件夹。- 在
if __name__ == '__main__':
部分,调用select_folder
函数启动整个程序。
程序运行演示
请注意,摘要算法不是加密算法,一旦计算就是无法回头,没有“解密”一说
运行前
(留意一下文件大小)
运行后
标签:加密,Python,摘要,算法,file,path,folder,SHA256 From: https://blog.csdn.net/weixin_45498884/article/details/141039854可以看到,文件的大小都变成了1KB,都是无法回头的。。。