项目介绍

该项目创建的目的为删除磁盘中重复文件,通过计算指定路径下的文件指纹(数字签名)来判断两个文件是否相同,从而按照文件名、文件指纹或模糊匹配删除相同文件

项目原理

计算机签名方法

数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。 是一种类似写在纸上的普通的物理签名

常用的数字签名方法主要有:
HASH算法 ,此算法主要包括MD(信息摘要)和SHA(安全散列算法)两类 。DSA、ECDSA、椭圆曲线数字签名算法,微软产品的序列号验证算法使用的就是ECDSA。与传统的数字签名算法相比,速度快,强度高,签名短

计算机签名 MD5

MD5简介

MD5是由Ron Rivest在1991设计的一种信息摘要(message-digest )算法,当给定任意长度的信息,MD5 会产生一个固定的 128 位“指纹”或者叫信息摘要。从理论的角度,所有的信息产生的 MD5 值都不同,也无法通过给定的 MD5 值产生任何信息,即不可逆

  1. 功能
    输入任意长度的信息,经过处理,输出为 128 位的信息(数字指纹)
    不同的输入得到的不同的结果(唯一性),要使两个不同的信息产生相同的摘要,操作数量级在 2^64 次方
    根据128位的输出结果不可能反推出输入的信息,根据给定的摘要反推原始信息,它的操作数量级在 2^128 次

  2. 用途

防止信息被篡改

1)当发送电子文档的同时发送文档的 MD5 值,接收后计算 MD5 值,若结果相同则没有被篡改
2)作为文件下载安全验证,在下载网络文件或程序时,为了防止不法分子在安装程序中添加木马,在网站上公布由安装文件得到的MD5输出结果。用户下载完成,在本地计算MD5值,比较结果,验证文件是否完整和安全

防止直接看到密码明文

现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。就算不法分子得到数据库种用户密码的MD5值,也无法知道用户的密码。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度

防止抵赖(数字签名)

这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”

MD5 算法步骤

MD5的算法输入为以bit为单位的信息(1 byte = 8 * bit),经过处理,得到一个128bit的摘要信息。这128位的摘要信息在计算过程中分成4个32bit的子信息,存储在4个buffer(A,B,C,D)中,它们初始化为固定常量。MD5算法然后使用每一个512bit的数据块去改变A,B,C,D中值,所有的数据处理完之后,把最终的A,B,C,D值拼接在一起,组成128bit的输出。处理每一块数据有四个类似的过程,每一个过程由16个相似的操作流组成,操作流中包括非线性函数,相加以及循环左移。MD5算法大致可分为5个步骤:

  1. 添加填充位
    信息的最尾部(不是每一块的尾部)要进行填充,使其最终的长度length(以bit为单位)满足length % 512 = 448,这一步始终要执行,即使信息的原始长度恰好符合上述要求
    填充规则:第一个bit填充位填 ‘1’ ,后续bit填充位都填 ‘0’ ,最终使消息的总体长度满足上述要求。总之,至少要填充 1 bit,至多填充 512 bit

  2. 添加bit长度
    添加一个64bit大小的length,length表示原始消息(未填充之前)的bit长度,极端情况,如果消息长度超过264,那么只使用前264bit消息,这一步完成之后,消息的最终长度变为(length + 64) % 512 = 0,即length为512的整数倍。从这里再去看第一步,至少需要填充 8 bit,有以下几种情况:
    1)消息原始长度 % 512 = 448,这时候原始长度符合要求,但是根据填充规则,仍然要至少填1bit的 ‘1’,后面还剩63bit,不够添加长度,所以需要再加一块数据(512bit),这样后面63bit填0,新加的数据前448bit填0,最后64bit填数据原始长度,长度值是放在最后一块数据的最后64bit
    2)消息原始长度 % 512 < 448,此时最后一块数据长度不大于440bit,最后64bit填数据长度,需要填充的bit数不小于8
    3)消息原始长度 % 512 > 448,此时最后一块数据长度不小于456,最多504,剩余bit不够添加64位长度,和假设1相同,需要增加一块数据,最后64位添加长度,其余填充0

  3. 初始化MD buffer(A,B,C,D)
    用4-word buffer(A, B, C, D)计算摘要,这里A,B,C,D各为一个32bit的变量,这些变量初始化为下面的十六进制值,低字节在前

/*word A: 01 23 45 67word B: 89 ab cd efword C: fe dc ba 98word D: 76 54 32 10
*/// 初始化A,B,C,D _atemp = 0x67452301; _btemp = 0xefcdab89; _ctemp = 0x98badcfe; _dtemp = 0x10325476;
  1. 按512位数据逐块处理输入信息
    512bit数据为一个处理单位,暂且称为一个数据块chunk,每个chunk经过4个函数(F, G, H, I)处理,这四个函数输入为3个32位(4字节)的值,产生一个32位的输出。四个函数如下所示:
/*
F(x,y,z) = (x & y) | ((~x) & z)
G(x,y,z) = (x & z) | ( y & (~z))
H(x,y,z) = x ^ y ^ z
I(x,y,z) = y ^ (x | (~z))*/

处理过程中要用一个含有64个元素的表K[1…64],表中的元素值由sin函数构建,K[i]等于2^(32) * abs(sin(i))的整数部分,即:

/*
K[i] = floor(2^(32) * abs(sin(i + 1))) // 因为此处i从0开始,所以需要sin(i + 1)
*/
for (int i = 0; i < 64; i++)
{ _k[i] = (size_t)(abs(sin(i + 1)) * pow(2, 32));
}

在处理一个chunk(512bit)的数据时,会把这个chunk再细分成16组4字节数据,一个chunk经过4轮进行处理,每轮都会把chunk的所有数据处理一遍,每轮有16个相似的子操作,所以一个chunk的数据要进行64个子操作计算之前先保存MD buffer的当前值:
a = A, b = B, c = C, d = D

第一轮:F函数处理(0 <= i <= 15)

F = F(b, c, d)
d = c
c =b
b = b + shift((a + F + k[i] + chunk[g]), s[i])
a = d

第二轮:G函数处理 (16 <= i <= 31)

G = G(b, c, d)
d = c
c =b
b = b + shift((a + G + k[i] + chunk[g]), s[i])
a = d

第三轮:H函数处理(32 <= i <= 47)

H = H(b, c, d)
d = c
c =b
b = b + shift((a + H + k[i] + chunk[g]), s[i])
a = d

第四轮:I函数处理(48 <= i <= 63)

I = I(b, c, d)
d = c
c =b
b = b + shift((a + I + k[i] + chunk[g]), s[i])
a = d

注:<<<s表示循环左移操作

/*
s[ 0..15] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22 }
s[16..31] = { 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20 }
s[32..47] = { 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23 }
s[48..63] = { 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 }*/
size_t s[] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 };
  if (0 <= i < 16) g = i; if (16 <= i < 32) g = (5 * i + 1) % 16; if (32 <= i < 48) g = (3 * i + 5) % 16;if(48 <= i < 63) g = (7 * i) % 16;

一个chunk数据处理完之后,更新MD buffer的值A, B, C, D

A = a + A;
B = b + B;
C = c + C;
D = d + D;
  1. 摘要输出

拼接4个buffer(A,B,C,D)中的摘要信息,以A中的低位字节开始,D的高位字节结束。最终的输出是128bit摘要信息的16进制表示,故最后输出一个32长度的摘要信息

项目流程及模块介绍

  1. 写出计算 MD5 值的程序(MD5.c & MD5.h)
  2. 写出根据 MD5 值、文件名、模糊匹配删除相同文件等关于文件处理的程序(fileManager.cpp & fileManager.h)
  3. 将上述关于文件操作的程序包到一个工具类中(fileManagerTool.cpp & fileManagerTool.h)
  4. 写出进行指定目录下文件检索找到文件的程序(fileutil.cpp & fileutil.h)
  5. 最后完成菜单设计,将功能实现(test.cpp)
  6. 对基本功能进行测试

    代码链接.

【项目】磁盘文件管理工具相关推荐

  1. TreeSizeFree磁盘文件管理工具

    推荐一款实用的文件管理工具,使用这款工具,可以一目了然的查看磁盘内文件的大小及占用情况,方便清理磁盘垃圾文件.话不多说,先提供绿色版免安装版本: 百度网盘下载链接:https://pan.baidu. ...

  2. 开源网络文件管理工具SmarkNetDisk

    Smark.NetDisk是一款基于Silverlight 和.net实再的网络文件管理工具,其主要目的是通过浏览器管理不同服务器的文件信息.Smark.NetDisk由两部分应用程序组成,服务端用. ...

  3. 查找重复文件_重复文件查找和磁盘整理工具:Tidy Up

    为大家带来一款实用的重复文件查找和磁盘整理工具,Tidy Up 5 for Mac可以用来快速查找重复文件并整理硬盘,tidy up 5 mac特别版会根据文件的种类组织分离找到项目,非常的好用. t ...

  4. 极简WEB文件管理工具(群晖)——TinyManager

    在之前<导出七牛云资源到本地>的文章中,我已经将文件全部转存到了群晖中,搭配Nginx已经可以实现直链访问.前几天又把自己电脑上存在的有用的软件包全部上传到了群晖,至此我的软件包文件夹已经 ...

  5. 云服务器 文件管理,云服务器文件管理工具

    云服务器文件管理工具 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 为安全起见 ...

  6. Disk Expert 3.6.1 可视化磁盘清理工具

    Disk Expert 是一款可视化Mac磁盘文件清理工具.Disk Expert 以可视化的图表形式显示您的磁盘空间使用情况,通过点击图表上的扇区可以快速查看对应目录下的文件列表,默认按文件大小排序 ...

  7. 好用的磁盘管理工具:DiskCatalogMaker for Mac

    DiskCatalogMaker Mac版是一款可以帮你管理磁盘目录盘的工具,DiskCatalogMaker for Mac可以压缩目录数据的磁盘空间.生成缩略图等,DiskCatalogMaker ...

  8. Linux 磁盘分区工具gdisk

    存储管理 主要知识点: 基本分区.逻辑卷LVM.EXT3/4/XFS文件系统.RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,突破了传 ...

  9. Path Finder for Mac(Mac文件管理工具)

    path finder for mac是Mac平台上一款能够让您完全控制文件的Mac文件管理工具.通过path finder for mac你可以按照自己的要求进行文件的排序,还可以直接显示隐藏文件, ...

最新文章

  1. scanner怎样回到文件开头_怎么申请专利?个人怎样申请国家专利?
  2. 美国拟将14项关键技术列入出口管制清单 商务部回应
  3. openssl/ssl.h file not found mac 完美解决
  4. SUSE Linux SFTP服务器配置
  5. 安卓连接linux软件,利用 Telnet 无线控制安卓手机 无需 Root
  6. Git代码管理常用命令操作
  7. VTK:几何对象之CylinderExample
  8. IOS开发如何在iTunes中查看沙河下的路径
  9. Linux设置RSA密钥登录
  10. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
  11. idea添加scala环境_idea怎么在线安装scala并且启动'
  12. C语言调用函数将is替换为be,C语言程序设计课件ppt.ppt
  13. NOIp2018集训test-9-17(pm)
  14. break、continue
  15. linux桌面监控软件,Ubuntu安装Conky系统监控桌面插件
  16. luogu p1330封锁阳光大学
  17. 遗传算法锦标赛选择java实现_多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c...
  18. Linux nodejs 安装以及配置环境
  19. 2020 IEEE 冯诺依曼奖得主:Michael Jordan --机器学习领域泰斗级人物
  20. linux开放7050端口,Linux操作系统内核启动参数详细解析

热门文章

  1. 程序员番茄炒生熟鸡蛋
  2. np.mat如何使用
  3. 我的曲院风荷-让自己慢下来(13)
  4. 数据结构二叉排序树的查找
  5. Python创建文件名为0000—nnnn的txt文件
  6. KAPPA领衔实施服装ERP软件树立行业榜样
  7. 【自动控制原理】 根轨迹法之根轨迹法分析系统性能
  8. 解决tomcat 静态页面(html)中文乱码终极篇
  9. 虚幻——动画蓝图、状态机制作人物走跑跳动作
  10. CVBS-复合视频广播信号[转]