基于硬盘序列号的电子文档加密方法

更新时间:2024-02-05 作者:用户投稿原创标记本站原创 点赞:6600 浏览:22832

研究提供计算机的硬盘序列号,用户输入的加密,通过硬盘序列号和用户来对电子文档进行二次加密保存.打开文档时,电子文档获取本地计算机的硬盘序列号和用户,利用同样的方式对文档进行检测,限制了电子文档只能在本地计算机上使用,有效的防止了电子文档的非法访问.


硬盘序列号 电子文档 加密 非法访问

1引言电子文档的普及和应用大大提高了企业单位的工作效率,但是在这同时,也产生了许多电子数据,由于电子数据的可复制性、和的不安全性,给一些不法分子带来的可乘之机,这个问题也是企事业单位一直以来遇到的最棘手的难题.现阶段电子文档的安全性保存方法大多都是依靠对文档的加密技术来完成的,而其中加密算法的难易程度决定了其文档的安全程度.比如说微软公司的word文档和winrar压缩文件加密,都仅仅是利用加密技术来对文档进行安全性控制,没有其他的安全保障.不管是多复杂的算法也都可以被,当一旦被非法人员或是盗用后,其资料就很容易被窃取盗用.本文研究和提供了一种有效的保护电子文档的加密方法,通过获取计算机硬盘的序列号来生成加密,对电子文档进行加密保护.加密后的电子文档只能在该文档创建的机器上通过输入用户来访问文档,有效的防止了电子文档的非法访问.

2算法的实现2.1算法原理通过硬盘,我们可以获取两种类型的序列号,一种是硬盘物理序列号,另外一种是硬盘逻辑序列号.硬盘物理序列号是硬盘出厂时厂家为了区别其他产品自带的、全世界唯一的、只读的一串硬盘编码.利用硬盘加密技术,通常是利用硬盘物理序列号的唯一性和只读性的特征.硬盘的逻辑序列号即为卷的序列号,是在格式化软盘或硬盘时系统随机分配一个序列号.我们DOS命令dir显示出的"卷的序列号是?8008-EA1A".该序列号是随机产生的,且具有唯一性.也就是因为这个原因许多软件的测试版本利用该项技术,使测试版在规定期限内才能使用,一旦过了限定期限就不能再使用,即使将该软件重新安装也无济于事.另外,有些共享软件的注册码也是通过这个序列号来生成的.同样的方法我们也可以运用到软件的防拷贝技术.2.2算法实现步骤为了把电子文档的安全级别提高,我们采用硬盘序列号和软件加密算法结合的方式对文档进行加密.首先需要获取到硬盘的序列号,其次,为了安全起见我们还需选择一种加密算法,这里我们使用DES加密算法.在保存文档时将文档通过用户设定的再加上硬盘序列号利用DES加密算法对文档进加密存放,当用户需要打开读取文档时,用户输入自己设定的以及系统获取当前硬盘上的系列号,进行解密.若加密时使用的硬盘序列号和打开文档时机器的硬盘序列号不一致时,说明文档非法,不能打开文件,如图1.这一步当然是由应用程序秘密运行,用户根本不知道,从而达到软件的二次加密目的,同时也隐藏了文档的合法性识别过程,使破译者无从下手.利用这种方法,我们就可以获取到计算机的硬盘物理与逻辑序列号,根据不同需求对电子文档进行加密保存.由于计算机硬盘序列号的唯一性,用非法途径得到电子文档的,就算知道了用户设定的,在其他设备上也是打开不了文档的.2.3算法实现2.3.1、硬盘的物理序列号的获取(1)在Visual C++中我们利用CreateFile函数可以打开计算机物理设备和串口等硬件设备,具体代码如下::CreateFile(sFilePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,0, NULL);其中sFilePath是磁盘文件路径,一般格式为\\\\\\\\.\\\\PHYSICALDRIVE0,0是磁盘号,可以是0-255.用使用CreateFile("\\\\\\\\.\\\\PHYSICALDRIVE0",等)可以打开硬盘.(2)使用DeviceIoControl函数对打开的设备进行通信,发送指定命令,根据返回的PSENDCMDOUTPARAMS结构,得到物理序列号和模型号,把物理序列号和模型号格式化为一定的格式输出.2.3.2、硬盘的逻辑序列号的获取在Visual C++环境中,我们需要用到GetVolumeInformation函数,通过函数我们可以获取到磁盘序列号和卷标及其它信息.具体函数定义如下:BOOL GetVolumeInformation(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer,DWORD nVolumeNameSize,LPDWORD lpVolumeSerialNumber,LPDWORD lpMaximumComponentLength,LPDWORD lpFileSystemFlags,LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);上述原型中,参数类型只要是以"LP-"开头的表明该参数用的是长指针(Long Pointer)类型,即在Visual C++中调用时的参数传递是通过引用传递.在8个参数中对我们真正有用的只有两个LPCTSTR?lpRootPathNam和LPDWORD lpVolumeSerialNumber.其中参数lpRootPathName是指向文件系统根目录的地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的.?

3结束语本文给我了一种利用硬盘序列号加密来保证电子文档安全的加密方法,利用其序列号的唯一性,确保了加密的可靠性,同时也保证了电子文档的安全性.这样一种方法,有效的保护了秘密文档的拷贝和的,有效的保护了用户的知识产权.