南阳理工学院软件学院网络安全编程课程设计.docx
- 文档编号:7086835
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:15
- 大小:77.19KB
南阳理工学院软件学院网络安全编程课程设计.docx
《南阳理工学院软件学院网络安全编程课程设计.docx》由会员分享,可在线阅读,更多相关《南阳理工学院软件学院网络安全编程课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
南阳理工学院软件学院网络安全编程课程设计
本文仅限参考,如有抄袭,复制,切JJ一枚
本文使用繁体编写,如有需要请使用wps文档繁体转换成简体阅读。
《網路安全編程》
姓名:
秦密
班級:
12級網安一班
學號:
1215135068
一、設計任務與要求
設計任務
使用檔輸入流從指定路徑和名稱的磁片中讀取指定的txt文本,對文本內容加密後重新輸出到原文件中。
設計要求
能夠實現對txt文本的加密與解密操作,加密後的文本不應具有可讀性,解密後的文本以保持原有的大小、格式,不應有文本行或字元、字串的丟失。
二、實現思想:
1.使用檔輸入輸出流:
iofstream從指定路徑的txt檔中讀取數據,使用檔輸入流的getline函數從原文件每次讀取一行作為一個字串寫入字串緩存空間szTmp中。
2.加密操作:
3.對緩存字串szTmp使用自定義的加密函數AL_Lock進行加密操作,將加密後的字串寫入一個臨時檔txtLocker.tmp中保存,待整個文本檔讀取並加密完成後,將加密後的檔從臨時檔txtLocker中逐個字元複製回原文件中,並對將緩存檔清空。
3.解密操作:
4.使用檔輸入輸出流逐行讀取加密後的檔,到字串緩存空間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取得的餘數作為邏輯移位的產生序列。
三:
加密實現過程
新建檔123.txt
運行加密程式
查看加密後的檔
解密檔
四:
程式源碼
#include"stdafx.h"
#include"stdio.h"
#include"fstream"
#include
usingnamespacestd;
//檔輸入輸出流
#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[])
{
inti=0;
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 { for(intj=i+1;j if(str2[i]>str2[j]) { Tmp=str2[i]; str2[i]=str2[j]; str2[j]=Tmp; } } returnstr2; } //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裏的字元按從小到大排序 for(inti=0;i { countj=0; for(intj=0;j 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,倒數第二位是換行符也要排除在字元長度之外不能參與字元排序交換 charTmp[ANum1];//ANum1需給定 for(i=0;i<(CMi/Len)*Len;i++)//選取str的Len的整數倍進行交換 { if(i%Len==0)j=0; Tmp[i]=str[(i/Len)*Len+(Num[j++]-1)]; } for(i;i { if(i%Len==0)j=0; 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)//用於對給定的列序數組再次求列序,文本解密時使用,使用此列序還原文本 { for(inti=0;i for(intj=0;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); returnstr; } //Line_Key字串列序匙函數,對str中的字元按key中字元密碼換序解密 //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); returnstr; } //Aph_Lock字串字母鎖函數,對str中的字元按key中字元密碼邏輯移位加密 //key中存放任意字元密碼 char*Aph_Lock(charstr[],charkey[])//需包含函數兩參數的strLen { for(inti=0;i { 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')//判斷字元是否屬於'A'—'Z',是則有可能是大寫字母 { t=str[i]+key[k++]-47; if(t>'Z')str[i]=t-26;//字元'0'對應整數48,若加字元後大於'Z'則-26,使其依然屬於'A'—'Z' elsestr[i]=t; } if(str[i]>='a'&&str[i]<='z')//判斷字元是否屬於'a'—'z',是則有可能是大寫字母 { t=str[i]+key[k++]-47; if(t>'z')str[i]=t-26;//字元'0'對應整數48,若加字元後大於'z'則-26,使其依然屬於'a'—'z' elsestr[i]=t; } if(str[i]==0)str[i]=9; if(str[i]<0)str[i]+=y; } returnstr; } //Aph_key字串字母鎖函數,對str中的字元按key中字元密碼換序加密 //key中存放任意字元密碼 char*Aph_Key(charstr[],charkey[])//需包含函數兩參數的strLen { for(inti=0;i { 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')//判斷字元是否屬於'A'—'Z',是則有可能是大寫字母 { t=str[i]-(key[k++]-47); if(t<'A')str[i]=t+26;//字元'0'對應整數48,若減字元後小於'A'則+26,使其依然屬於'A'—'Z' elsestr[i]=t; } if(str[i]>='a'&&str[i]<='z')//判斷字元是否屬於'a'—'z',是則有可能是大寫字母 { t=str[i]-(key[k++]-47); if(t<'a')str[i]=t+26;//字元'0'對應整數48,若減字元後小於'a'則+26,使其依然屬於'a'—'z' elsestr[i]=t; } if(str[i]<=0)str[i]-=y; } returnstr; } //AL_Lock字串列序鎖函數,對str中的字元按key中字元密碼換序加密 //key中存放任意字元密碼,對符合列排序大小關係的密碼均可解密 char*AL_Lock(charstr[],charkey[])//需包含函數Aph_Lock、Line_Lock { Aph_Lock(str,key); Line_Lock(str,key); returnstr; } //LA_Key字串列序鎖函數,對str中的字元按key中字元密碼換序加密 //key中存放任意字元密碼,對符合列排序大小關係的密碼均可解密 char*LA_Key(charstr[],charkey[])//需包含函數Aph_Lock、Line_Lock { Line_Key(str,key); Aph_Key(str,key); returnstr; } 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"; cout<<"txt文本加密器,請選擇操作\n"; cout<<"\n1.加密2.解密Enter鍵確認"; cout<<"\n----------------------------------------------------------\n\n\n選擇: "; cin>>Select; }while(Select! =1&&Select! =2); do { cout<<"\n請輸入要加密檔的完整路徑名稱\n如: d: \\1.txt"; cout<<"\n\n\n完整路徑名稱為: "; cin>>finame; fin.open(finame);//用檔輸入流打待處理檔finame if(! fin)cout<<"\n要加密的檔打開失敗\n";//偌輸入的檔完整路徑名稱不正確則給出提示資訊 }while(! fin);//直到輸入的檔完整路徑名稱正確時繼續進行下麵的操作 fout.open(foname);//用檔輸出流打開檔foname,沒有則創建,有則清空 if(! fout){cout<<"\n系統盤空間可能不足,檔"< 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,讀取時每行僅讀到字元'\n'停止,該字元不存到szTmp中 { lineNum++; AL_Lock(szTmp,key);//對字串szTmp用key進行加密 fout< cout< totalSize+=strLen(szTmp);//統計每個字串的字元數,計算檔的大小 } } elseif(Select==2) { while(fin.getline(szTmp,ANum1-1,'\n')) { lineNum++; LA_Key(szTmp,key);//對字串szTmp用key進行解密 fout< cout< totalSize+=strLen(szTmp); } } cout<<"\n----------------------------------------------------------\n"; if(Select==1)cout<<"\n文本加密完畢"; elseif(Select==2)cout<<"\n文本解密完畢"; cout<<"\n此文本有"< fin.close();//關閉兩個打開的檔 fout.close(); //------------------------------------------------------------------------------ //將處理後的檔複製回原文件中 fin.open(foname); fout.open(finame); while(fin.get(tmp))//從輸入檔foname中逐個字元讀取數據,寫入tmp中 { fout.put(tmp);//將tmp寫回到原文件finame中 } fin.close();//關閉兩個打開的檔 fout.close(); fout.open(foname);//清空文件緩存中文件中的內容 fout.close(); //------------------------------------------------------------------------------ cout<<"\n----------------------------------------------------------\n"; cout<<"\n0.退出1.繼續選擇: "; cin>>lable; cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; }while(lable); } 五: 實驗總結 在編寫代碼過程中,根據實現設計好的類及類的成員一步步進行,相對思路比較清晰;具體實現過程中,也會出現各種細節問題,借助XX,穀歌等搜索引擎以及與周圍師生的討論也能一一解決。 通過不斷發現問題,不斷解決問題,從而提高對面向對象概念的認識,對編程結構的理解。 在編寫代碼的同時,還參考了很多的源代碼的編寫,閱讀其他高級程式員的源代碼的過程,也是一個學習的過程,包括學習更優秀的編程理念,還有更規範的編程風格。 通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,但是沒有理論知識,單純對代碼的理解還是非常困難的。 理論可以使我們面對實踐的時候更容易入手,而實踐可以使我們更深刻的理解理論知識。 總之,只有通過不斷的實踐,並在實踐中經常性的去領悟其中的理論知識,才能夠提高自己的實際動手能力和獨立思考的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南阳 理工学院 软件 学院 网络安全 编程 课程设计