基于 MD5 算法的文件完整性校验程序
一、实验目的
① 深入理解 MD5 算法的基本原理。
② 掌握利用 MD5 算法生成数据摘要的所有计算过程。
③ 掌握 Linux 系统中检测文件完整性的基本方法。
④ 熟悉 Linux 系统中文件的基本操作方法。
⑤ 准确地实现 MD5 算法的完整计算过程。
⑥ 对于任意长度的字符串能够生成 128 位 MD5 摘要。
⑦ 对于任意大小的文件能够生成 128 位 MD5 摘要。
⑧ 通过检查 MD5 摘要的正确性来检验原文件的完整性。
二、实验内容
本实验使用 C++ 语言在 Linux 平台进行编程和运行,代码运行于腾讯云服务器主机。实现了实验要求中关于 MD5 的五项功能,列举如下:
./md5 -h 查看帮助
./md5 -t 打印程序的测试信息
./md5 -c nankai.txt 计算出的被测文件的 MD5 摘要并打印
./md5 -v nankai.txt 验证文件完整性方法一
./md5 -f nankai.txt nankai.md5 验证文件完整性方法二 实验涉及的文件包括:
(1) main.cpp:主函数文件。
(2) helpFunc.h:功能函数定义。
(3) helpFunc.cpp:功能函数实现。
(4) MD5.h:MD5 类定义。
(5) MD5.cpp:MD5 类的部分函数实现。
(6) MD5Update.cpp:MD5 类中 Update 相关函数实现。
(7) MD5codePro.cpp:MD5 类中进制转换、类型变换相关函数实现。
(8) nankai.txt 和 nankai.md5:测试文件
(9) md5:可执行文件
三、实验步骤及实验结果
本次实验步骤:
(1) main.cpp:主函数文件。
通过 unordered_map 数据结构存储各操作的 string 和对应的函数指针。
(2) helpFunc.h:各功能函数的定义,以及 include 程序需要的一些系统文件。
(3) helpFunc.cpp:功能函数实现。 各函数根据实验报告的要求调用 MD5 类的功能并打印信息。
(4) MD5.h:MD5 类定义,包括一些运算的 define。
(5) MD5.cpp:MD5 类的部分功能实现,主要为 Reset 函数,Tostring 函数,Transform 函数。
(6) MD5Update.cpp:MD5 类中 Update 相关函数,包括 2 个 public 函数和 1 个 private 函数。
(7) MD5codePro.cpp:MD5 类定义中进制转换、类型变换相关函数实现。
本次实验结果:
(1)./md5 -h
(2)./md5 -t
(3)./md5 -c nankai.txt
(4)./md5 -v nankai.txt
(5)./md5 -f nankai.txt nankai.md5
四、实验遇到的问题及其解决方法
本次实验中遇到的问题和解决方法列举如下:
(1)问题:大小端编址问题。 解决方法:遇到大小端编址问题,需要仔细检查,如 MD5 算法中有四个
32 比特的初始向量。它们分别是:A=0x01234567,B=0x89abcdef, C=0xfedcba98,D=0x76543210。实际赋值的时候应该赋值为 A=0x67452301, B=0xefcdab89,C=0x98badcfe,D=0x10325476。
五、实验结论
学习了 MD5 的原理和实现过程 学习了大端编址和小端编址
学习了在 C++ 的 STL 中存放函数指针
学习了 main()函数中的 argv 和 argc 参数的使用