C++文件加密Word文档格式.docx
《C++文件加密Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++文件加密Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
文件加密的一些简单算法
完成
期限
自2014年6月16日至2009年7月4日共3周
设
计
依
据
文件加密是一种根据要求在操作系统层自动地对写入存储介质的数据进行加密的技术。
本软件能对一个文本文件进行加密和解密。
要
求
及
主
内
容
本程序是运用MFC(vc6.0)进行编写,主要运用以下几个方面的知识:
使用文件输入流从指定路径和名称的磁盘中读取指定的txt文本,对文本内容加密后重新输出到原文件中。
能够实现对txt文本的加密与解密操作,加密后的文本不应具
有可读性,解密后的文本以保持原有的大小、格式,不应有文本行或字符、字符串的丢失。
参
考
资
料
[1]钱能.C++程序设计教程.清华大学出版社.2013
[2]严蔚敏陈文博编著.数据结构及应用算法教程.清华大学出版社.2008.
[3]C++Primer(第四版).人民邮电出版社.
指导教
师签字
日期
2014.6.10
摘要
文件加密数据防泄漏的必要性及重要性
在信息时代,信息安全问题越来越重要。
我们经常需要一种措施来保护我们的数据,防止被一些怀有不良用心的人所看到或者破坏。
因此,在客观上就需要一种强有力的安全措施来保护机密数据不被窃取或篡改。
解决这个问题的方式就是文件加密来保证数据防泄漏。
一个加密网络,不但可以防止非授权用户的搭线窃听和入网,而且也是对付恶意软件的有效方法之一。
有些时候用户可能需要对一些机密文件进行加密,不一定因为要在网络上进行传输该文件,而是担心有人窃取计算机口令而获得该机密文件。
身份认证是基于加密软件技术的,作用为用来确定用户是否是真实的。
在传输过程中对数据进行加密,可以保障数据在传输过程中安全。
网络安全所要求的保密性、完整性、可用性,都可以利用密码技术来实现。
可以说,密码技术是保护大型通信网络上传输信息的实用手段之一。
本文主要介绍有文本文件加密及解密的算法,按照上述的编程范式,介绍了需要哪些类,类中包含哪些数据成员,每个类需要提供怎样的一组操作,类和类之间继承关系如何表示。
主要分为5个部分,第一部分介绍了选题及需求分析;
第二部分介绍了概要设计;
第三部分结束了详细设计需要考虑的问题;
第四部分介绍了重要的代码;
第五部分课程设计的总结。
【关键词】面向对象设计,加密,解密,算法
一、设计任务与要求
设计任务
使用文件输入流从指定路径和名称的磁盘中读取指定的txt文本,对文本内容加密后重新输出到原文件中。
设计要求
能够实现对txt文本的加密与解密操作,加密后的文本不应具有可读性,解密后的文本以保持原有的大小、格式,不应有文本行或字符、字符串的丢失。
二、实现思想:
1.使用文件输入输出流iofstream从指定路径的txt文件中读取数据,使用文件输入流的getline函数从原文件每次读取一行作为一个字符串写入字符串缓存空间szTmp中。
2.加密操作:
对缓存字符串szTmp使用自定义的加密函数AL_Lock进行加密操作,将加密后的字符串写入一个临时文件txtLocker.tmp中保存,待整个文本文件读取并加密完成后,将加密后的文件从临时文件txtLocker中逐个字符复制回原文件中,并对将缓存文件清空。
3.解密操作:
使用文件输入输出流逐行读取加密后的文件,到字符串缓存空间szTmp中,对字符串szTmp使用自定义的解密函数LA_Key进行解密操作,直到文件解密完成;
解密操作完成后,将解密后的文件写回原文件中。
4.加密函数AL_Lock的实现思想:
AL_Lock包含两个自定义的加密函数Line_Lock和Aph_Lock。
对字符串进行加密时,有两种基本的加密思想。
其一是对字符串中的各个字符按照一个给定的顺序进行换序加密操作。
如:
字符串”abcdef”字符序列”326154”加密后为”cbfaed”。
此程序中自定义的加密函数Line_Lock就是用于实现此功能。
另一种加密思想是对字符序列进行逻辑移位加密,加密数值增加到字符的ASCII码值中。
如字符序列”abcde”按字符序列”11211”进行逻辑移位加密后字符串为”bceef”。
此程序中自定义的加密函数Aph_Lock就是用于实现此功能。
AL_Lock加密函数为这两种加密思想结合使用构建的加密函数,先使用逻辑移位加密函数Aph_Lock进行加密,在使用换序加密函数Line_Lock对其进行加密。
5.解密函数LA_Key的实现思想:
解密函数为加密函数的逆过程,先使用解密函数Line_Key对加密后的字符串进行原来顺序的恢复操作,再使用逻辑移位解密函数Aph_Key对恢复原序的字符串进行逻辑解密操作。
6.加密解密序列的生成,给定任意一个字符串序列如:
”7415369”按字符由小到大的顺序逐个字符给定其对应位置产生字符串序列”3524617”该序列即为换序加密时可用的加密序列使用Line_Lock即可对字符加密。
在此程序中用于生成加密序列的函数为getNum。
而产生的加密序列经字符串数据转换函数char2int转换后转换为整型数据,利用除3取得的余数作为逻辑移位的产生序列。
三、软件设计
1.程序运行基本结果截图
(1)程序运行时主界面与操作选择
(2)文本win7.txt加密前
(3)加密时界面显示和相关信息
(4)文本win7.txt加密后
(5)解密时的输入界面
(6)解密时界面显示
(7)文本win7.txt解密后
2.源程序清单与注释
#include<
iostream.h>
//基本输入输出流
fstream.h>
//文件输入输出流
#defineANum13000
#defineANum23500
//strLen求字符串求长函数求任意长度字符串的长度
intstrLen(charstr[])
{
inti=0;
while(str[i++]);
returni;
}
//char2int转换,将字符串数str,转换为整型数,如:
“123457”->
123457
intchar2int(charstr[])
intTotal=0,i=0,intTmp;
while(str[i])
{
Tmp=str[i++]-48;
//Tmp用于存储字符串各个字节处转换后的的数字s[i]-48,转换前该字节处用s[i]表示该数字字符
Total=Total*10+Tmp;
//将各位数字字合成字符所表示的数据
}
returnTotal;
//返回数字处理后得到的数字
//strCopy字符串拷贝函数,将字符串从源文件str1拷贝到目标文件str2,返回值str2所对应的字符串
char*strCopy(charstr2[],constcharstr1[])
while(str1[i]){str2[i]=str1[i++];
str2[i]=0;
returnstr2;
//strSort对字符串内字符排序函数,对str1排序后存储到str2中,str1保持不变,返回值str2
char*strSort(charstr1[],charstr2[])//需包含strCopy、strLen两个构造函数
strCopy(str2,str1);
charTmp;
for(inti=0;
i<
strLen(str2)-2;
i++)
for(intj=i+1;
j<
strLen(str2)-1;
j++)
if(str2[i]>
str2[j])
{
Tmp=str2[i];
str2[i]=str2[j];
str2[j]=Tmp;
}
//getNum字符串自动生成列序函数,根据输入的字符串大小数序依次取出对应的列号存放到Num数组中,如:
getNum("
95423"
Num),可得列序Num[]={4,5,3,2,1}
int*getNum(charstr[],intNum[])//需包含strLen、strSort两个构造函数文本加密时使用,使用此列序加密文本
{
intcountk,countj;
charTmp[ANum1];
strSort(str,Tmp);
//对Tmp里的字符按从小到大排序
strLen(str)-1;
countj=0;
for(intj=0;
if(Tmp[i]==str[j])//Tmp中某一个字符与str中的某个字符相同时
countj++;
//countj用于计数str中第几个字符与Tmp[i]相同,故每次i循环计数前时清为0
Num[i]=j+1;
intk=i;
countk=1;
while(Tmp[k--]==Tmp[k-1])countk++;
//countk用于计数Tmp中多少个相同的字符,故每次计数前清为1
if(countj==countk)j=strLen(str)-1;
//当Tmp中第几个相同的字符与str中第几个相同的字符对应时退出循环
returnNum;
//strSort对字符串内字符排序函数,对str1中字符按Num里给的字符顺序进行排序,Len为Num数组的元素个数
char*strSort(charstr[],intNum[],intLen)//需包含strLen、strCopy两个构造函数
intj,i,CMi=strLen(str)-2;
//因为在使用gets获取一整行字符串时最后一位是字符结尾0,倒数第二位是换行符也要排除在字符长度之外不能参与字符排序交换
//ANum1需给定
for(i=0;
(CMi/Len)*Len;
i++)//选取str的Len的整数倍进行交换
if(i%Len==0)j=0;
Tmp[i]=str[(i/Len)*Len+(Num[j++]-1)];
for(i;
CMi+1;
i++)//选取str的Len的余数部分原样拷贝,多加一位将倒数第二位的换行符也拷贝上
Tmp[i]=str[i];
Tmp[i]=0;
//为字符串添加结尾
strCopy(str,Tmp);
returnstr;
//getNum数组自动生成列序函数,根据输入数组中数据的大小数序依次取出对应的列号存放到Num数组中,如:
getNum({1,5,4,2,3},Num),可得列序Num[]={1,4,5,3,2}
//数组Num1中元素需从1开始连续且不相同,Len1为数组Num1中元素个数
int*getNum(intNum1[],intNum2[],intLen1)//用于对给定的列序数组再次求列序,文本解密时使用,使用此列序还原文本
i<
Len1;
j<
if(Num1[j]==i+1)Num2[i]=j+1;
returnNum2;
//Line_Lock字符串列序锁函数,对str中的字符按key中字符密码换序加密
//key中存放任意字符密码,对符合列排序大小关系的密码均可解密
char*Line_Lock(charstr[],charkey[])//需包含函数两参数的Get_Nu、三参数的strSort
intkeyTmp[ANum1];
getNum(key,keyTmp);
strSort(str,keyTmp,strLen(key)-1);
//Line_Key字符串列序匙函数,对str中的字符按key中字符密码换序解密
char*Line_Key(charstr[],charkey[])//需包含函数两参数的getNum、三参数的getNum、三参数的strSort
intkeyTmp1[ANum1],keyNTmp[ANum1];
getNum(key,keyTmp1);
getNum(keyTmp1,keyNTmp,strLen(key)-1);
strSort(str,keyNTmp,strLen(key)-1);
//Aph_Lock字符串字母锁函数,对str中的字符按key中字符密码逻辑移位加密
//key中存放任意字符密码
char*Aph_Lock(charstr[],charkey[])//需包含函数两参数的strLen
strLen(str)-1;
intk,t,y,Num=char2int(key);
y=Num%3;
Num/=3;
if(y!
=0)y=1;
if(i%(strLen(key)-1)==0)k=0;
//该循环使得key密码中的字符循环发挥作用对字符加密
if(str[i]>
='
A'
&
&
str[i]<
Z'
)//判断字符是否属于'
—'
是则有可能是大写字母
{
t=str[i]+key[k++]-47;
if(t>
'
)str[i]=t-26;
//字符'
0'
对应整数48,若加字符后大于'
则-26,使其依然属于'
elsestr[i]=t;
}
a'
z'
if(str[i]==0)str[i]=9;
if(str[i]<
0)str[i]+=y;
//Aph_key字符串字母锁函数,对str中的字符按key中字符密码换序加密
char*Aph_Key(charstr[],charkey[])//需包含函数两参数的strLen
t=str[i]-(key[k++]-47);
if(t<
)str[i]=t+26;
//字符'
对应整数48,若减字符后小于'
则+26,使其依然属于'
=0)str[i]-=y;
//AL_Lock字符串列序锁函数,对str中的字符按key中字符密码换序加密
char*AL_Lock(charstr[],charkey[])//需包含函数Aph_Lock、Line_Lock
Aph_Lock(str,key);
Line_Lock(str,key);
//LA_Key字符串列序锁函数,对str中的字符按key中字符密码换序加密
char*LA_Key(charstr[],charkey[])//需包含函数Aph_Lock、Line_Lock
Line_Key(str,key);
Aph_Key(str,key);
voidmain()
intlable=1,Select,totalSize,lineNum;
chartmp;
charfiname[256];
//定义输入字符串finame用于存放源文件的完整路径和名称
charfoname[256]="
C:
\\WINDOWS\\temp\\txtLocker.tmp"
;
//将文件处理的结果先缓存到textLocker.tmp
charszTmp[ANum1],key[ANum1];
ifstreamfin;
//(ifstream:
inputfilestream)定义一个文件输入流对象fin,从文件中输入数据参见C++程序设计pag300
ofstreamfout;
//定义一个文件输出流对象fout,输出数据到文件中
do
Select=0;
totalSize=0;
lineNum=0;
do
cout<
<
"
\n----------------------------------------------------------\n"
txt文本加密器,请选择操作\n"
\n1.加密2.解密Enter键确认"
\n----------------------------------------------------------\n\n\n选择:
cin>
>
Select;
}while(Select!
=1&
Select!
=2);
\n请输入要加密文件的完整路径名称\n如:
d:
\\1.txt"
\n\n\n完整路径名称为:
finame;
fin.open(finame);
//用文件输入流打待处理文件finame
if(!
fin)cout<
\n要加密的文件打开失败\n"
//偌输入的文件完整路径名称不正确则给出提示信息
}while(!
fin);
//直到输入的文件完整路径名称正确时继续进行下面的操作
fout.open(foname);
//用文件输出流打开文件foname,没有则创建,有则清空
if(!
fout){cout<
\n系统盘空间可能不足,文件"
foname<
创建失败\n"
return;
if(Select==1)cout<
\n请输入加密的密码:
"
elseif(Select==2)cout<
\n请输入解密的密码:
cin>
key;
if(Select==1)
while(fin.getline(szTmp,ANum1-1,'
\n'
))//从待加密的文件中读取一行,存储到字符串szTmp中,每行字符串的最大长度为ANum1-1,读取时每行仅读到字符'
停止,该字符不存到szTmp中
lineNum++;
AL_Lock(szTmp,key);
//对字符串szTmp用key进行加密
fout<
szTmp<
endl;
//将加密后的字符串szTmp输出到输出文件foname中
cout<
//写入文件的同时输出至屏幕进行显示
totalSize+=strLen(szTmp);
//统计每个字符串的字符数,计算文件的大小
elseif(Select==2)
))
LA_Key(szTmp,key);
//对字符串szTmp用key进行解密
f