基于SHA-512的文件损毁检测系统
2021-06-16李若曦
李若曦
(华东理工大学 上海市 200237)
1 引言
1.1 研究背景及意义
当今世界处于网络全球化的时代,互联网时代最显著、最重要的特征就是信息的发送、传输和获取。传输过程中,信息面临着信息泄露、完整性破坏、拒绝服务、未授权访问[1]等重重安全威胁,每一种潜在威胁都会使信息的传输出现错误进而传输失败。网络使用者冒充其他使用者,对文件进行收发,对所收到的信息进行更改。此种问题一旦出现会影响网络整体安全性,出现混乱现象,尤其是在银行、政府机关等社会大型服务系统中,任何节点数据的错误都会导致无可估量的损失。怎样确保信息安全、完整就成为了亟待解决的关键问题。借助数字签名技术,可以有效解决验证数据完整性的问题。
数字签名技术主要用于证实消息的真正来源,也是解决一个消息的发送者和接收者之间的争端的基础。基于对称密码体制和非对称密码体制(公钥密码体制)都可以设计数字签名方案。使用对称密码体制,需要引入第三方作为可信方,将数字签名过程与可信方控制的硬件器件相结合,接收者通过一个防窜扰器件能确保消息来自于发送者。密钥被储存在防窜扰器件内,接收者无法访问,在可信方的控制下管理密钥。基于非对称密码体制可以设计出更强大的数字签名方案。该方案包含签名、验证两部分内容。数字签名在现代Web 商务中具有重要意义。多数国家已经把数字签名看成与手工签名具有相同法律效力的授权机制[2]。
数字签名固然好,但没有解决非对称加密算法的速度慢和密文大的问题(因为用发送方的私钥加密整个明文消息时,由于明文消息很大,可能导致加密过程很慢)。基于此问题,专家学者提出了消息摘要机制。消息摘要类似于纵向冗余校验,用于验证数据完整性。消息摘要通常占128 位以上,这样任意两个消息摘要相同的机会小于大大提高了可靠性。
在信息安全技术中,经常需要验证消息的完整性,散列函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。散列函数是算法的核心。现存机制大致可分为两种,即MD5 类和SHA 类。
1.2 课题内容
本文以SHA-512 算法为核心介绍消息摘要体制的原理,描述实现计算文件的哈希值生成对应的消息摘要,并把文件的消息摘要进行比较的损毁检测系统。此次开发的环境为Code::Blocks,使用C++语言进行编程。
2 SHA-512算法原理
SHA-512 算法所用的输入是最大长度小于2128位的消息,输出是512 位的信息摘要,输出消息以1024 位的分组为单位进行处理。SHA-512 严格按照SHA-1 模型,而SHA-1 是在MD4 基础上修改而成的,故SHA-512 与MD5 有相似之处。
2.1 填充
在初始消息中增加填充位,使消息长度模1024 与896 同余,即使已满足仍然需要继续填充。填充由一个1 和后续的0 组成。
表1:初始化链接变量的值
表2:80 个常数K 的值
2.2 添加长度
计算不包括填充位的消息长度,并把它作为一个128 位的无符号整数块附加到填充位的后面,这样消息长度正好是1024 位的倍数。如果消息长度超过128 位,则只取后128 位,即等于计算length mod 128。
2.3 分为1024位的块
把消息分解,每个块长度为1024 位,这些块就是消息摘要处理逻辑的输入。[3]
2.4 初始化链接变量(缓冲区)
Hash 函数的中间结果和最终结果保存在512 位的链接变量中。链接变量用8 个64 位的寄存器表示,并将这些寄存器初始化为64位的整数(十六进制值)。这些字的获取方式为前8 个素数取平方根,取小数部分的前64 位。初始化链接变量的值如表1 所示。
2.5 处理块
2.5.1 字分块
将当前的1024 位数据块分解成16 个字块,每个字块长度为64 位;
2.5.2 字扩展
扩展每一个消息分组,要把16 个字扩展为80 个字。原1024位块的16 个字组成了前面16 个字(W0-W15),后面64 个字(W16-W79),每个按如下公式迭代求出:
2.5.3 压缩函数轮变换
对数据每个分组的处理包含80 个轮。每一轮的输入包含三个参数:8 个之前的缓冲(链接变量),扩展后的字(Wi),一个64位的常数Kt。开始处理时,把8 个缓冲值保存在8 个临时变量中,经过79 轮处理结束后再把这些值加到从第79 步创建的值上。
2.6 每一轮的结构
每轮64 位缓冲的8 个值都是前一轮的缓冲值所创建的。轮函数每轮的8 个输入字如图1 所示。
有两个混合器、三个函数。每个混合器把两个函数组合起来。[4]轮函数的结构如图2 所示。
其中,A 与E 的值由如下公式求出:
其中,
XOR 指模264加法。
有80 个常数K,每个十六进制64 位。与8 个缓冲区的初值算法相同。80 个常数K 的值如表2 所示。
综上,sha-512 中的压缩函数总览如图3,经过每一字块的80轮变换产生一512 位的消息摘要。
3 系统设计
3.1 系统开发环境
3.1.1 Code::Blocks 环境
Code::Blocks 是一个由The Code::Blocks Team 由C++语言开发的开放源码的全功能的集成开发环境,主要支持c 和c++语言。使用了著名的图形界面库wxWidgets 库,捆绑了MinGW 编译器。跨编译器包括gcc/g++、Visual C++、Borland C++、Intel C++等超过20 多款编译器。同时它也支持多种语言的编译,包括D 语言等。它是一个跨平台的集成开发环境,可以在Windows、GNU/Linux、MacOS X 平台上使用。Code::Blocks 提供了多种工程模板,这包括:控制台应用、DirectX 应用、动态连接库、OpenGL 应用、QT 应用等,还支持用户自己定义的工程模板。具有便利的语法高亮、代码覆盖、分析和自动完成等工具,支持工程管理、项目构建、调试。
3.1.2 C++
对广泛流行的C 语言进行扩充的C++语言,是典型的面向对象语言。它解决了C 语言不支持代码重用、类型检查机制弱、面向过程对大型软件开发的缺陷等问题,是一种优秀的既支持面向过程、又支持面向对象的混合型的程序设计语言。
C++保持与C 的兼容,用C 语言编写的众多函数库可以用于C++中。C++保持了C 的简洁、高效、接近汇编语言的特点,在运行效率上接近C 语言,而且增加面向对象的机制,包括抽象数据类型、封装和信息隐藏、继承和派生、函数运算符重载、虚函数、模板,这些机制的存在为大中型软件的开发变得更加容易。
图1:轮函数每轮的8 个输入字
图2:轮函数的结构
图3:SHA-512 压缩函数(轮变换)
3.2 数据结构设计
unsigned long long data[0x2000000]读入文件数据
unsigned long long T1 混合器2(设计时与原理中的混合器编号相反)
unsigned long long T2 混合器1
unsigned long longW[80]扩展后的一个字
unsigned long longHashI_1[8]中间结果
unsigned long longHashI[8]最终结果
const unsigned long longKt[80]80 个常数
string filename 输入的文件名或文件地址
图4:计算文件的初始哈希值
图5:检验文件是否损毁-文件未损毁
图6:检验文件是否损毁-文件已损毁
string hashstring 文件的哈希值(消息摘要)
struct file{
char address[180];
charhashstr[550];
};结构体:文件名/地址和它的哈希值
3.3 函数设计
算法设计为一个sha512 类,两个功能函数main1、main2 分别进行计算文件初始的哈希值、检验损毁操作,一个主函数实现由用户的界面操作得到的指令执行不同的功能函数。
sha512 类中的函数:
sha512(string f);构造函数
void InitializeHash();缓冲区初始化
unsigned long long ROTR(unsigned long longx,int n); 单步轮变换
void SHA_512(int N);轮变换
void sha512main(); 输入文件的处理
void savehash();保存文件的哈希值到指定txt 文件
void printhash();屏幕输出文件的哈希值
char* gethashstr(); 将哈希值数组转换为字符串
外部函数:
功能函数main1:计算文件的初始哈希值
功能函数main2:检验文件是否损毁
主函数main:系统循环
4 系统实现
4.1 系统界面设计
本系统功能简单,使用命令行模式界面,由用户选择对应数字的对应功能实现功能函数的调用。
4.2 运行过程及结果
4.2.1 计算文件的初始哈希值
用户选择选项1 后,根据提示输入文件的地址即可显示出该文件的哈希值。如图4 所示。
4.2.2 检验文件是否损毁
用户选择选项2,根据提示输入曾经计算过哈希值的文件地址即可显示出是否损毁。
文件修改前,输出文件的哈希值并提示未损毁。如图5 所示。
文件修改后,显示出新的哈希值并提示已损毁。如图6 所示。
4.2.3 退出系统
用户选择选项3 后,退出系统。
5 结论
程序最终可以实现计算哈希值,保存每一次文件的哈希值到本地数据文件(txt)中,当再次输入文件地址进行检验时,系统通过比对输入文件当前的哈希值和数据文件中的哈希值,检验文件是否损毁。