![信息安全工程實踐_第1頁](http://file4.renrendoc.com/view/10fc93edb831e4fbb6439239f8e38400/10fc93edb831e4fbb6439239f8e384001.gif)
![信息安全工程實踐_第2頁](http://file4.renrendoc.com/view/10fc93edb831e4fbb6439239f8e38400/10fc93edb831e4fbb6439239f8e384002.gif)
![信息安全工程實踐_第3頁](http://file4.renrendoc.com/view/10fc93edb831e4fbb6439239f8e38400/10fc93edb831e4fbb6439239f8e384003.gif)
![信息安全工程實踐_第4頁](http://file4.renrendoc.com/view/10fc93edb831e4fbb6439239f8e38400/10fc93edb831e4fbb6439239f8e384004.gif)
![信息安全工程實踐_第5頁](http://file4.renrendoc.com/view/10fc93edb831e4fbb6439239f8e38400/10fc93edb831e4fbb6439239f8e384005.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
信息平安工程實踐平安編程基于USBKey的軟件授權(quán)編程試驗【試驗內(nèi)容】了解USBKey的使用和工作原理把握通過USBKey把握軟件啟動和加密的簡潔程序【試驗原理】USBKey是一種插在計算機USB口上的軟硬件結(jié)合的設(shè)備,USBKey內(nèi)置單片機或智能卡芯片,具有肯定的存儲空間和運算處理力量,使得USBKey具有推斷、分析的處理力量,增加了主動的反解密力量。USBKey的內(nèi)置芯片里包含有專用的加密算法軟件,USBKey廠家供應一套USBKey的讀寫接口(API)給開發(fā)商,開發(fā)商在開發(fā)中通過在軟件執(zhí)行過程中和USBKey交換數(shù)據(jù)來實現(xiàn)加解密。目前多在USBKey中存儲用戶的私鑰以及數(shù)字證書,利用USBKey內(nèi)置的公鑰算法實現(xiàn)對用戶身份的認證,同時也可以通過USBKey防止未授權(quán)的用戶對軟件進行復制和破解?!驹囼灜h(huán)境】運行環(huán)境:MicrosoftVisualStudio2005編程語言:C#【試驗步驟】加密狗本試驗使用的加密狗,是一種類似于U盤的小硬件,是一種防盜版的方式。加密狗就是一種插在計算機并行口上的軟硬件結(jié)合的加密產(chǎn)品,為多數(shù)軟件開發(fā)商所接受。加密狗一般都有幾十或幾百字節(jié)的非易失性存儲空間可供讀寫,現(xiàn)在較新的加密狗內(nèi)部還包含了單片機。軟件開發(fā)者可以通過接口函數(shù)和加密狗進行數(shù)據(jù)交換(即對加密狗進行讀寫),來檢查加密狗是否插在并行口上;或者直接用加密狗附帶的工具加密自己EXE文件(俗稱"包殼")。這樣,軟件開發(fā)者可以在軟件中設(shè)置多處軟件鎖,利用加密狗做為鑰匙來打開這些鎖;假如沒插加密狗或加密狗不對應,軟件將不能正常執(zhí)行。加密狗廠家都會供應一套加密狗的讀寫接口(API)給開發(fā)商,廠家賣給開發(fā)商的狗都有各自的區(qū)分,某個開發(fā)商只能操作自己買的加密狗。加密狗通過在軟件執(zhí)行過程中和加密狗交換數(shù)據(jù)來實現(xiàn)加密的,加密狗內(nèi)置單片機電路(也稱CPU),使得加密狗具有推斷、分析的處理力量,增加了主動的反解密力量。這種加密產(chǎn)品稱它為“智能型”加密狗。加密狗內(nèi)置的單片機里包含有專用于加密的算法軟件,該軟件被寫入單片機后,就不能再被讀出。這樣,就保證了加密狗硬件不能被復制。加密狗使用的簡潔實例此實例通過加密狗來把握軟件的啟動。運行頁面如圖5.1.11所示為主程序窗口的運行畫面,要運行程序,必需先成功啟動加密狗。圖5.1.11主要代碼:注:把加密狗所供應的DLL文件(本試驗為Rockey2.dll)加載到程序的\Bin\Debug\名目下。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;namespaceDogTest{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}#region引用加密狗所供應的接口[DllImport("Rockey2.dll")]staticexternintRY2_Find();[DllImport("Rockey2.dll")]staticexternintRY2_Open(intmode,Int32uid,refInt32hid);[DllImport("Rockey2.dll")]staticexternvoidRY2_Close(inthandle);[DllImport("Rockey2.dll")]staticexternintRY2_GenUID(inthandle,refInt32uid,Stringseed,intisProtect);[DllImport("Rockey2.dll")]staticexternintRY2_Read(inthandle,intblock_index,StringBuilderbuffer512);[DllImport("Rockey2.dll")]staticexternintRY2_Write(inthandle,intblock_index,Stringbuffer512);#endregion//啟動按鈕的大事代碼privatevoidBtn_start_Click(objectsender,EventArgse){Stringstrinfo;intret=0;Int32handle=0;Int32hid=0;Int32uid=0;Stringseed,Writebuff;CharcRead='0';stringReadBuff=newstring(cRead,512);//查找ret=RY2_Find();if(ret<=0){listBox1.Items.Add("NotFindRockey2!");return;}listBox1.Items.Add("FindRockey21!");//打開ret=RY2_Open(0,0,refhid);if(ret!=0){strinfo="Err:"+handle;listBox1.Items.Add(strinfo);return;}handle=ret;strinfo="Rockey2:"+hid;listBox1.Items.Add(strinfo);//取得UIDseed="Rockey2";ret=RY2_GenUID(handle,refuid,seed,0);strinfo="GenUid:"+uid;listBox1.Items.Add(strinfo);//關(guān)閉RY2_Close(handle);strinfo="CloseRockey2!";listBox1.Items.Add(strinfo);//查找,發(fā)覺ret=RY2_Find();//打開ret=RY2_Open(1,uid,refhid);handle=ret;//寫入數(shù)據(jù)Writebuff="WelcometousedRockey2!";ret=RY2_Write(handle,0,Writebuff);strinfo="WriteData:"+"WelcometousedRockey2!";listBox1.Items.Add(strinfo);//讀取數(shù)據(jù)StringBuilderretbuff=newStringBuilder("0",512);ret=RY2_Read(handle,0,retbuff);strinfo="ReadData:"+retbuff.ToString();listBox1.Items.Add(strinfo);DialogResultdr=MessageBox.Show("加密狗已經(jīng)成功啟動!","xiaoxi",MessageBoxButtons.OK);if(dr==DialogResult.OK){WorkMainwork=newWorkMain();work.Show();}}privatevoidBtn_clear_Click(objectsender,EventArgse)//清空按鈕的大事代碼{listBox1.Items.Clear();}運行此實例的界面假如沒有正確加載加密狗,程序會告知我們沒有發(fā)覺加密狗,如圖5.1.12所示。圖5.1.12假如正確加載加密狗,程序會有相應提示,如圖5.1.13所示。圖5.1.13點擊“確定”按鈕后,進入工作頁面,如圖5.1.14所示。圖5.1.14【試驗思考】依據(jù)自己的硬件不同,試編寫程序通過加密狗來把握此程序的運行;通過加密狗來把握所編程序的使用人數(shù)。利用BouncyCastleAPI加密編程試驗【試驗內(nèi)容】使用BouncyCastleAPI接口進行編程【試驗原理】BouncyCastle是一種用于Java平臺的開放源碼的輕量級密碼包。它支持大量的密碼算法,并供應JCE1.2.1的實現(xiàn)。由于BouncyCastle被設(shè)計成輕量級的,所以從J2SE1.4到J2ME(包括MIDP)平臺,它都可以運行,是在MIDP上運行的唯一完整的密碼包。后來也供應C#版本的API。BouncyCastleAPI功能很強大,對于初學者來說,辨認類之間的關(guān)系以及方法參數(shù)和返回值的正確類型有肯定難度。通常,開發(fā)人員必需掃瞄源代碼和測試用例來爭辯BouncyCastleAPI的主要功能。可以從/csharp/網(wǎng)站上可以下載最新的C#版本的DLL類庫和源代碼?!驹囼灜h(huán)境】運行環(huán)境:MicrosoftVisualStudio2005編程語言:C#【試驗步驟】利用BouncyCastleAPI編碼實現(xiàn)對數(shù)據(jù)的加解密將其DLL類庫,添加到自己的項目中,示例的源代碼呈現(xiàn)如下:本例的主頁面如圖5.1.21所示。圖5.1.21其頁面的主要代碼為:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;namespaceBouncyCastleAPI{publicpartialclassTestCrypto:Form{string[]strEn={"",""};string[]strDe={"","",""};publicTestCrypto(){InitializeComponent();}privatevoidBtn_Source_Click(objectsender,EventArgse){OpenFileDialogfiledlg=newOpenFileDialog();filedlg.Filter="文本文件(*.txt)|*.txt";if(filedlg.ShowDialog()==DialogResult.OK){txt_Source.Text=filedlg.FileName;}}privatevoidBtn_target_Click(objectsender,EventArgse){OpenFileDialogfiledlg=newOpenFileDialog();filedlg.Filter="文本文件(*.txt)|*.txt";if(filedlg.ShowDialog()==DialogResult.OK){txt_target.Text=filedlg.FileName;}}//加密privatevoidBtn_Encrypt_Click(objectsender,EventArgse){if(txt_Source.Text==""||txt_Source.Text==string.Empty){MessageBox.Show("請選擇文件!");return;}if(txt_target.Text==""||txt_target.Text==string.Empty){MessageBox.Show("請選擇文件!");return;}else{strEn[0]=txt_Source.Text;strEn[1]=txt_target.Text;DESEncrypto.Inin(strEn);//調(diào)用DESEncrypto類}}//解密privatevoidBtn_Decrypt_Click(objectsender,EventArgse){if(txt_Source.Text==""||txt_Source.Text==string.Empty){MessageBox.Show("請選擇文件!");return;}if(txt_target.Text==""||txt_target.Text==string.Empty){MessageBox.Show("請選擇文件!");return;}else{strDe[0]=txt_Source.Text;strDe[1]=txt_target.Text;//相對于當前工作名目stringstrPath=Directory.GetCurrentDirectory();stringstrKey=strPath+"\\"+"deskey.dat";//密鑰文件路徑strDe[2]=strKey;DESEncrypto.Inin(strDe);//調(diào)用DESEncrypto類}}}}DESEncrypto的具體代碼usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;usingOrg.BouncyCastle.Crypto;//請留意命名空間的引用usingOrg.BouncyCastle.Crypto.Engines;usingOrg.BouncyCastle.Crypto.Generators;usingOrg.BouncyCastle.Crypto.Modes;usingOrg.BouncyCastle.Crypto.Paddings;usingOrg.BouncyCastle.Crypto.Parameters;usingOrg.BouncyCastle.Security;usingOrg.BouncyCastle.Utilities.Encoders;namespaceBouncyCastleAPI{publicclassDESEncrypto{///true:解密,false:解密privateboolencrypt=true;///句柄privatePaddedBufferedBlockCiphercipher=null;///輸入流(源文件)privateStreaminStr=null;///輸出流(目標文件)privateStreamoutStr=null;///密鑰privatebyte[]key=null;publicstaticvoidInin(string[]args){boolencrypt=true;stringinfile=null;stringoutfile=null;stringkeyfile=null;if(args.Length<2){Console.Error.WriteLine("Usage:"+typeof(DESEncrypto).Name+"infileoutfile[keyfile]");Environment.Exit(1);}keyfile="deskey.dat";infile=args[0];outfile=args[1];if(args.Length>2){encrypt=false;keyfile=args[2];}DESEncryptodes=newDESEncrypto(infile,outfile,keyfile,encrypt);cess();}publicDESEncrypto(stringinfile,stringoutfile,stringkeyfile,boolencrypt) {this.encrypt=encrypt;try { inStr=File.OpenRead(infile);//打開文件 }catch(FileNotFoundException) {Console.Error.WriteLine("Inputfilenotfound["+infile+"]");Environment.Exit(1); }try { outStr=File.Create(outfile);//打開文件 }catch(IOException) {Console.Error.WriteLine("Outputfilenotcreated["+outfile+"]");Environment.Exit(1); }if(encrypt) {try {///創(chuàng)建密鑰文件deskey.datSecureRandomsr=newSecureRandom();KeyGenerationParameterskgp=newKeyGenerationParameters(sr,DesEdeParameters.DesEdeKeyLength*8);DesEdeKeyGeneratorkg=newDesEdeKeyGenerator(); kg.Init(kgp); key=kg.GenerateKey();Streamkeystream=File.Create(keyfile);byte[]keyhex=Hex.Encode(key); keystream.Write(keyhex,0,keyhex.Length); keystream.Flush(); keystream.Close(); }catch(IOException) {Console.Error.WriteLine("Couldnotdecryptioncreatekeyfile"+"["+keyfile+"]");Environment.Exit(1); } }else {try {///讀密鑰文件deskey.datStreamkeystream=File.OpenRead(keyfile);intlen=(int)keystream.Length;byte[]keyhex=newbyte[len]; keystream.Read(keyhex,0,len); key=Hex.Decode(keyhex); }catch(IOException) {Console.Error.WriteLine("Decryptionkeyfilenotfound," +"ornotvalid["+keyfile+"]");Environment.Exit(1); } } }privatevoidprocess(){//填充模式CBC;分組模式Pkcs7cipher=newPaddedBufferedBlockCipher(newCbcBlockCipher(newDesEdeEngine()));if(encrypt){performEncrypt(key);}else{performDecrypt(key);}try{inStr.Close();outStr.Flush();outStr.Close();}catch(IOException){}}///<summary>///加密///</summary>///<paramname="key"></param>privatevoidperformEncrypt(byte[]key){cipher.Init(true,newKeyParameter(key));intinBlockSize=47;intoutBlockSize=cipher.GetOutputSize(inBlockSize);byte[]inblock=newbyte[inBlockSize];byte[]outblock=newbyte[outBlockSize];try{intinL;intoutL;byte[]rv=null;while((inL=inStr.Read(inblock,0,inBlockSize))>0){outL=cipher.ProcessBytes(inblock,0,inL,outblock,0);if(outL>0){rv=Hex.Encode(outblock,0,outL);outStr.Write(rv,0,rv.Length);outStr.WriteByte((byte)'\n');}}try{outL=cipher.DoFinal(outblock,0);if(outL>0){rv=Hex.Encode(outblock,0,outL);outStr.Write(rv,0,rv.Length);outStr.WriteByte((byte)'\n');}}catch(CryptoException){}}catch(IOExceptionioeread){Console.Error.WriteLine(ioeread.StackTrace);}}///<summary>///解密///</summary>///<paramname="key"></param>privatevoidperformDecrypt(byte[]key){cipher.Init(false,newKeyParameter(key));StreamReaderbr=newStreamReader(inStr);try{intoutL;byte[]inblock=null;byte[]outblock=null;stringrv=null;while((rv=br.ReadLine())!=null){inblock=Hex.Decode(rv);outblock=newbyte[cipher.GetOutputSize(inblock.Length)];outL=cipher.ProcessBytes(inblock,0,inblock.Length,outblock,0);if(outL>0){outStr.Write(outblock,0,outL);}}try{outL=cipher.DoFinal(outblock,0);if(outL>0){outStr.Write(outblock,0,outL);}}catch(CryptoException){}}catch(IOExceptionioeread){Console.Error.WriteLine(ioeread.StackTrace);}}}}程序運行效果“明文.txt”文件的內(nèi)容為:12345678,如圖5.1.22所示;“密文.txt”和“解密后的文件.txt“均為空。圖5.1.22通過程序進行加密,如圖5.1.23所示。圖5.1.23加密后“密文.txt”內(nèi)容如圖5.1.24所示。圖5.1.24通過程序?qū)Α懊芪?txt“進行解密,如圖5.1.25所示。圖5.1.25解密后“解密后的文件.txt“文件的內(nèi)容如圖5.1.26所示。圖5.1.26觀看比較其加密前后相關(guān)文件的內(nèi)容?!驹囼炈伎肌苛私釨ouncyCastleAPI接口的使用,試用其接口實現(xiàn)相關(guān)的加密算法,如ASE,3DES等加密算法;了解并學習BouncyCastleAPI接口中的其它模塊的功能和應用。利用CrypteAPI加密編程試驗【試驗內(nèi)容】使用Crypto
API接口進行編程【試驗原理】微軟公司在NT4.0以上版本中供應了一套完整的Crypto
API的函數(shù),其功能是為應用程序開發(fā)者供應在Win32環(huán)境下使用加密、驗證等平安服務(wù)時的標準加密接口。用戶在對軟件進行愛護的時候可以直接利用Crypto
API來完成這些工作,比如計算注冊碼,檢查程序的完整性等。用這些的API進行加密解密的時候,只需要知道如何去應用它們,而不必知道它們的底層實現(xiàn)。CryptoAPI處于應用程序和CSP(cryptographicserviceprovider)之間,如圖5.1.31所示:圖5.1.31CryptoAPI共有五部分組成:簡潔消息函數(shù)(SimplifiedMessageFunctions)、低層消息函數(shù)(Low-levelMessageFunctions)、基本加密函數(shù)(BaseCryptographicFunctions)、證書編解碼函數(shù)(CertificateEncode/DecodeFunctions)和證書庫管理函數(shù)(CertificateStoreFunctions)。其中前三者可用于對敏感信息進行加密或簽名處理,可保證網(wǎng)絡(luò)傳輸信息的私有性;后兩者通過對證書的使用,可保證網(wǎng)絡(luò)信息溝通中的認證性。大家或許對CSP還比較迷惑。其實CSP是真正實行加密的獨立模塊,它既可以由軟件實現(xiàn)也可以由硬件實現(xiàn)。但是它必需符合CryptoAPI接口的規(guī)范。每個CSP都有一個名字和一個類型。每個CSP的名字是唯一的,這樣便于CryptoAPI找到對應的CSP。目前支持CryptoAPI的Windows系統(tǒng)有:Windows95OSR2、WindowsNTSP3及后續(xù)版本、Windows98、Windows2000等。CryptoAPI的配置信息存儲在注冊表中,包括如下密鑰:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults和HKEY_CURRENT_USER\Software\Microsoft\Cryptography\Providers。CryptoAPI使用兩種密鑰:會話密鑰與公共/私人密鑰對。會話密鑰使用相同的加密和解密密鑰,這種算法較快,但必需保證密鑰的平安傳遞。公共/私人密鑰對使用一個公共密鑰和一個私人密鑰,私人密鑰只有專人才能使用,公共密鑰可以廣泛傳播。假如密鑰對中的一個用于加密,另一個肯定用于解密。公共/私人密鑰對算法很慢,一般只用于加密小批數(shù)據(jù),例如用于加密會話密鑰。CryptoAPI支持兩種基本的編碼方法:流式編碼和塊編碼。流式編碼在明碼文本的每一位上創(chuàng)建編碼位,速度較快,但平安性較低。塊編碼在一個完整的塊(一般為64位)上工作,需要使用填充的方法對要編碼的數(shù)據(jù)進行舍入,以組成多個完整的塊。這種算法速度較慢,但更平安?!驹囼灜h(huán)境】運行環(huán)境:MicrosoftVisualStudio2005編程語言:C++【試驗步驟】運用Crypto
API編程的運行環(huán)境首先需要Crypt32.lib,將它加到project->setting->link下面,也可以在程序中用#pragma
comment
(lib,
"crypt32.lib")加入。在程序開頭,要加入兩個頭文件
Windows.h
和Wincrypt.h,和一個#define
MY_ENCODING_TYPE
(PKCS_7_ASN_ENCODING
|
X509_ASN_ENCODING)
。利用CryptoAPI實現(xiàn)對數(shù)據(jù)的加解密先加入一個頭文件targetver.h,文件內(nèi)容如下:#pragmaonce//以下宏定義要求的最低平臺。要求的最低平臺//是具有運行應用程序所需功能的Windows、InternetExplorer等產(chǎn)品的//最早版本。通過在指定版本及更低版本的平臺上啟用全部可用的功能,宏可以//正常工作。//假如必需要針對低于以下指定版本的平臺,請修改下列定義。//有關(guān)不同平臺對應值的最新信息,請參考MSDN。#ifndef_WIN32_WINNT//指定要求的最低平臺是WindowsVista。#define_WIN32_WINNT0x0600//將此值更改為相應的值,以適用于Windows的其他版本。#endif以下為test.cpp文件的主要代碼,#include"stdafx.h"#include<stdio.h>#include<Windows.h>#include<wincrypt.h>#include<targetver.h>#include<stdlib.h>#defineMY_ENCODING_TYPE(PKCS_7_ASN_ENCODING|X509_ASN_ENCODING)#defineKEYLENGTH0x00800000voidHandleError(char*s);#defineENCRYPT_ALGORITHMCALG_RC4#defineENCRYPT_BLOCK_SIZE8//聲明:szSource為要加密的文件名稱,szDestination為加密過的文件名稱,szPassWord為加密口令BOOLEncryptFile( PCHARszSource, PCHARszDestination, PCHARszPassWord);voidmain(void){CHARszSource[100];CHARszDestination[100];CHARszPassWord[100]; printf("Encryptafile.\n\n"); printf("Enterthenameofthefiletobeencrypted:"); scanf("%s",szSource); printf("Enterthenameoftheoutputfile:"); scanf("%s",szDestination); printf("EnterthepassWord:"); scanf("%s",szPassWord);//調(diào)用加密方法if(EncryptFile(szSource,szDestination,szPassWord)) { printf("Encryptionofthefile%swasasuccess.\n",szSource); printf("Theencrypteddataisinfile%s.\n",szDestination); }else { HandleError("Errorencryptingfile!"); } system("pause");//暫停,按任意鍵連續(xù)}//加密方法staticBOOLEncryptFile(PCHARszSource,PCHARszDestination,PCHARszPassWord){ //聲明和初始化局部變量 FILE*hSource; FILE*hDestination; HCRYPTPROVhCryptProv; HCRYPTKEYhKey; HCRYPTHASHhHash; PBYTEpbBuffer; DWORDdwBlockLen; DWORDdwBufferLen; DWORDdwCount; //打開源文件if(hSource=fopen(szSource,"rb")) { printf("Thesourceplaintext/cryptotextfile,%s,isopen.\n",szSource); }else { HandleError("Erroropeningsourceplaintextfile!"); }//打開目的文件if(hDestination=fopen(szDestination,"wb")) { printf("Destinationfile%sisopen.\n",szDestination); }else { HandleError("Erroropeningdestinationciphertextfile!"); }//以下獲得一個CSP句柄if(CryptAcquireContext( &hCryptProv, NULL, //NULL表示使用默認密鑰容器,默認密鑰容器名為用戶登錄名 NULL, PROV_RSA_FULL, 0)) { printf("Acryptographicproviderhasbeenacquired.\n"); }else {//創(chuàng)建密鑰容器if(CryptAcquireContext( &hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {//創(chuàng)建密鑰容器成功,并得到CSP句柄 printf("Anewkeycontainerhasbeencreated.\n"); }else { HandleError("Couldnotcreateanewkeycontainer.\n"); } }//創(chuàng)建一個會話密鑰(sessionkey)//會話密鑰也叫對稱密鑰,用于對稱加密算法。//(注:一個Session是指從調(diào)用函數(shù)CryptAcquireContext到調(diào)用函數(shù)//CryptReleaseContext期間的階段。會話密鑰只能存在于一個會話過程) //Createahashobject.if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)){printf("Ahashobjecthasbeencreated.\n");}else{ HandleError("ErrorduringCryptCreateHash!\n");}//用輸入的密碼產(chǎn)生一個散列if(CryptHashData(hHash,(BYTE*)szPassWord,strlen(szPassWord),0)) { printf("ThepassWordhasbeenaddedtothehash.\n"); }else { HandleError("ErrorduringCryptHashData.\n"); }//通過散列生成會話密鑰if(CryptDeriveKey(hCryptProv,ENCRYPT_ALGORITHM,hHash,KEYLENGTH,&hKey)) { printf("AnencryptionkeyisderivedfromthepassWordhash.\n"); }else { HandleError("ErrorduringCryptDeriveKey!\n"); }//刪除散列表 CryptDestroyHash(hHash); hHash=NULL; //由于加密算法是按ENCRYPT_BLOCK_SIZE大小的塊加密的,所以被加密的//數(shù)據(jù)長度必需是ENCRYPT_BLOCK_SIZE的整數(shù)倍。下面計算一次加密的//數(shù)據(jù)長度。 dwBlockLen=1000-1000%ENCRYPT_BLOCK_SIZE; //假如使用塊編碼,則需要額外空間if(ENCRYPT_BLOCK_SIZE>1) dwBufferLen=dwBlockLen+ENCRYPT_BLOCK_SIZE;else dwBufferLen=dwBlockLen; //安排內(nèi)存if(pbBuffer=(BYTE*)malloc(dwBufferLen)) { printf("Memoryhasbeenallocatedforthebuffer.\n"); }else { HandleError("Outofmemory.\n"); }//加密源文件,并將數(shù)據(jù)寫入目標文件do { //從源文件中讀出dwBlockLen個字節(jié) dwCount=fread(pbBuffer,1,dwBlockLen,hSource);if(ferror(hSource)) { HandleError("Errorreadingplaintext!\n"); } //加密數(shù)據(jù)if(!CryptEncrypt( hKey, //密鑰 0, //假如數(shù)據(jù)同時進行散列和加密,這里傳入一個散列對象 feof(hSource), //假如是最終一個被加密的塊,輸入TRUE.假如不是輸.//入FALSE這里通過推斷是否到文件尾來打算是否為最終一塊。 0, //保留 pbBuffer, //輸入被加密數(shù)據(jù),輸出加密后的數(shù)據(jù) &dwCount, //輸入被加密數(shù)據(jù)實際長度,輸出加密后數(shù)據(jù)長度 dwBufferLen)) //pbBuffer的大小。 { HandleError("ErrorduringCryptEncrypt.\n"); }//解密數(shù)據(jù)(注:解密文件時,替換上面的加密數(shù)據(jù)方法即可)//if(!CryptDecrypt(// hKey, //密鑰// 0, //假如數(shù)據(jù)同時進行散列和加密,這里傳入一個散列對象// feof(hSource), //假如是最終一個被加密的塊,輸入TRUE.假如不是輸.// //入FALSE這里通過推斷是否到文件尾來打算是否為最終一塊。// 0, //保留// pbBuffer, //輸入被加密數(shù)據(jù),輸出加密后的數(shù)據(jù)// &dwCount //輸入被加密數(shù)據(jù)實際長度,輸出加密后數(shù)據(jù)長度// )) //{// HandleError("ErrorduringCryptEncrypt.\n");//} //將加密過的數(shù)據(jù)寫入目標文件 fwrite(pbBuffer,1,dwCount,hDestination);if(ferror(hDestination)) { HandleError("Errorwritingciphertext."); } }while(!feof(hSource));//關(guān)閉文件、釋放內(nèi)存if(hSource) fclose(hSource);if(hDestination) fclose(hDestination); if(pbBuffer) free(pbBuffer); if(hKey) CryptDestroyKey(hKey); if(hHash) CryptDestroyHash(hHash); if(hCryptProv) CryptReleaseContext(hCryptProv,0);return(TRUE); }//特別處理方法voidHandleError(char*s){fprintf(stderr,"Anerroroccurredinrunningtheprogram.\n");fprintf(stderr,"%s\n",s);fprintf(stderr,"Errornumber%x.\n",GetLastError());fprintf(stderr,"Programterminating.\n");exit(1);}運行畫面如圖5.1.32和圖5.1.33所示。圖5.1.32圖5.1.33打開目的文件,觀看其加密后的文件內(nèi)容;解密其文件,把加密后的文件和源文件對比?!驹囼炈伎肌苛私釩ryptoAPI接口的使用,及其強大的加密功能。本例中使用會話密鑰進行加密,在此基礎(chǔ)上了解公共/私人密鑰對;除直接用于加密數(shù)據(jù)外,CryptoAPI還廣泛用于產(chǎn)生并確認數(shù)字簽名等,請利用CryptoAPI編寫相關(guān)的程序。基于Socket的C/S應用程序編程試驗【試驗內(nèi)容】使socket編程實現(xiàn)發(fā)送和接收網(wǎng)絡(luò)上的數(shù)據(jù)編程通過加密實現(xiàn)平安通信【試驗原理】要通過互聯(lián)網(wǎng)進行通信,你至少需要一對套接字,其中一個運行于客戶機端,我們稱之為ClientSocket,另一個運行于服務(wù)器端,我們稱之為ServerSocket。依據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端懇求,連接確認。所謂服務(wù)器監(jiān)聽,是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。所謂客戶端懇求,是指由客戶端的套接字提出連接懇求,要連接的目標是服務(wù)器端的套接字。為此,客戶端的套接字必需首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接懇求。所謂連接確認,是指當服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接懇求,它就響應客戶端套接字的懇求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務(wù)器端套接字連續(xù)處于監(jiān)聽狀態(tài),連續(xù)接收其它客戶端套接字的連接懇求。在這個信息的時代,通訊的平安性越來越受到重視;通過對信息加密后在進行傳輸,能夠有效地保障信息的平安性、保密性和完整性?!驹囼灜h(huán)境】運行環(huán)境:MicrosoftVisualStudio2005編程語言:C#【試驗步驟】服務(wù)器端程序:程序名稱:Program.cs示例程序的簡潔步驟說明服務(wù)器端:用指定的端口號和服務(wù)器的IP建立一個EndPoint對像;建立一個Socket對像;用socket對像的Bind()方法綁定EndPoint;用socket對像的Listen()方法開頭監(jiān)聽;接受到客戶端的連接,用socket對像的Accept()方法創(chuàng)建新的socket對像用于和懇求的客戶端進行通信;通信結(jié)束后肯定記得關(guān)閉socket。服務(wù)器端的具體代碼usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceServer{classProgram{staticvoidMain(string[]args){intport=2000;stringhost="";///創(chuàng)建終結(jié)點(EndPoint)IPAddressip=IPAddress.Parse(host);//把ip地址字符串轉(zhuǎn)換為IPAddress類型的實例IPEndPointipe=newIPEndPoint(ip,port);//用指定的端口和ip初始化IPEndPoint類的新實例///創(chuàng)建socket并開頭監(jiān)聽Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//參數(shù)分別為:socket實例所使用的尋址方式、套接字類型、使用的傳輸把握協(xié)議;//創(chuàng)建一個socket對像,假如用udp協(xié)議,則要用SocketType.Dgram類型的套接字s.Bind(ipe);//綁定EndPoint對像(端口和ip地址)s.Listen(0);//開頭監(jiān)聽Console.WriteLine("等待客戶端連接...");///接受client連接,為此連接建立新的socket,并接受信息Sockettemp=s.Accept();//為新建連接創(chuàng)建新的socketConsole.WriteLine("建立連接");stringrecvStr="";byte[]recvBytes=newbyte[1024];intbytes;bytes=temp.Receive(recvBytes,recvBytes.Length,0);//從客戶端接受信息,返回接收到的字節(jié)數(shù)recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);///給client端返回信息Console.WriteLine("servergetmessage:{0}",recvStr);//顯示客戶端傳來的信息stringsendStr="OK!Clientsendmessagesuccessful!";byte[]bs=Encoding.ASCII.GetBytes(sendStr);temp.Send(bs,bs.Length,0);//返回信息給客戶端temp.Close();s.Close();Console.ReadLine();}}}服務(wù)器端運行界面如圖5.1.41所示。圖5.1.41客戶端運行后,服務(wù)器端運行界面如圖5.1.42所示。圖5.1.42客戶端程序程序名稱:Program.cs示例程序的簡潔步驟說明客戶端:用指定的端口號和服務(wù)器的IP建立一個EndPoint對象;建立一個Socket對象;用socket對象的Connect()方法以上面建立的EndPoint對象做為參數(shù),向服務(wù)器發(fā)出連接懇求;假如連接成功,就用socket對象的Send()方法向服務(wù)器發(fā)送信息;用socket對象的Receive()方法接受服務(wù)器發(fā)來的信息;通信結(jié)束后肯定記得關(guān)閉socket??蛻舳说木唧w代碼usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceClient{classProgram{staticvoidMain(string[]args){try{intport=2000;stringhost="";///創(chuàng)建終結(jié)點EndPointIPAddressip=IPAddress.Parse(host);IPEndPointipe=newIPEndPoint(ip,port);//把ip和端口轉(zhuǎn)化為IPEndpoint實例///創(chuàng)建socket并連接到服務(wù)器Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//創(chuàng)建Socket,參數(shù)分別為:socket實例所使用的尋址方式、套接字類型、使用的傳輸把握協(xié)議Console.WriteLine("連接…");c.Connect(ipe);//連接到服務(wù)器///向服務(wù)器發(fā)送信息stringsendStr="Hello!Thisisasockettest!";byte[]bs=Encoding.ASCII.GetBytes(sendStr);//把字符串編碼為字節(jié)Console.WriteLine("發(fā)送消息");c.Send(bs,bs.Length,0);//發(fā)送信息///接受從服務(wù)器返回的信息stringrecvStr="";byte[]recvBytes=newbyte[1024];intbytes;bytes=c.Receive(recvBytes,recvBytes.Length,0);//從服務(wù)器端接受信息,此方法的返回值為接收到的字節(jié)數(shù)recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);Console.WriteLine("clientgetmessage:{0}",recvStr);//顯示服務(wù)器返回信息c.Close();Console.ReadLine();}catch(ArgumentNullExceptione){Console.WriteLine("argumentNullException:{0}",e);}catch(SocketExceptione){Console.WriteLine("SocketException:{0}",e);}Console.WriteLine("PressEntertoExit");}}}客戶端運行界面如圖5.1.43所示。圖5.1.43加密傳輸信息,保障通訊平安可以通過ISES密碼學模塊詳述的加密算法或BouncyCastleAPI接口等方式,對服務(wù)端與客戶端的信息進行加密和解密,保障其通訊的平安性。【試驗思考】理解實例所實現(xiàn)的功能,在此基礎(chǔ)上修改程序為不同主機的通信;思考socket的異步傳輸?shù)?;綜合密碼學的相關(guān)學問,思考通信過程的平安性,并動手調(diào)試相關(guān)程序。駐留程序編程試驗【試驗內(nèi)容】進程的查詢程序內(nèi)存駐留的實現(xiàn)程序的激活條件等【試驗原理】駐留程序TSR(TerminatebutStayResident)是一種特殊應用程序,它在裝入內(nèi)存運行后,其部分代碼仍舊駐留在內(nèi)存,當該段代碼被激活時,它又進入運行狀態(tài)。常用的駐留程序是作為某個中斷處理程序的一部分,其激活條件就是系統(tǒng)產(chǎn)生了此中斷的中斷懇求。也有黑客利用其功能,編寫程序?qū)W(wǎng)絡(luò)中的計算機進行破壞。雖然駐留程序可依據(jù)具體的需要有不同的編寫方式,但其典型結(jié)構(gòu)包括以下幾部分:保存、修改中斷向量表。程序第一次運行時的初始化部分:用自己定義的地址來取代中斷向量表中的原地址;確定駐留代碼部分的字節(jié)數(shù);用中斷21H之功能31H把需要駐留代碼部分駐留在內(nèi)存。駐留內(nèi)存的代碼部分?!驹囼灜h(huán)境】運行環(huán)境:MicrosoftVisualStudio2005編程語言:C#【試驗步驟】查看進程程序在執(zhí)行時,一般都會顯示出窗口,但是一般后門或者病毒程序都是在后臺運行的??梢酝ㄟ^其下方法來查看進程:Ctrl+Alt+Delete鍵組合,打開Windows任務(wù)管理器窗口,點擊‘進程’選項卡,如圖5.1.51所示。圖5.1.51Windows任務(wù)管理器通過程序查看當前系統(tǒng)運行的進程:例題名稱:查看當前系統(tǒng)運行的進程程序名稱:Program.cs具體代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Diagnostics;usingMicrosoft.Win32;namespaceMyTest{classProgram{staticvoidMain(string[]args){Process[]pList=Process.GetProcesses();//取當前系統(tǒng)所運行的進程Console.WriteLine("\n系統(tǒng)中所運行的進程列表:");foreach(ProcesspinpList){Console.WriteLine(p.ProcessName.ToString());//循環(huán)顯示全部進程}Console.Read();}}}編寫內(nèi)存駐留程序例題名稱:內(nèi)存駐留程序的編寫程序名稱:test.exe具體代碼如下:usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Threading;usingMicrosoft.Win32;namespacetest{staticclassProgram{///<summary>///應用程序的主入口點。///</summary>[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Test();}privatestaticvoidMyTest(){stringstr=System.Environment.SystemDirectory;//取操作系統(tǒng)路徑stringstrSousrce=System.Windows.Forms.Application.ExecutablePath;//獵取啟動了應用程序的可執(zhí)行文件的路徑,包括可執(zhí)行文件名inti=strSousrce.LastIndexOf('\\');stringsub=strSousrce.Substring(i,strSousrce.Length-i);//截取可執(zhí)行文件的文件名stringstrDest=str.Insert(str.Length,sub);//連接字符串if(!File.Exists(strDest)){File.Copy(strSousrce,strDest);//拷貝可執(zhí)行文件到系統(tǒng)名目下}}privatestaticvoidTest(){while(true){MyTest();//調(diào)用函數(shù)Thread.Sleep(100);//將當前線程堵塞指定的時間}}}編譯執(zhí)行程序,程序并沒有任何的顯示,打開任務(wù)管理器,查看進程選項卡,可以看到在后臺執(zhí)行的text.exe文件,如圖5.1.52所示。圖5.1.52實現(xiàn)程序的自動駐留程序在執(zhí)行時不顯示任何界面,為了實現(xiàn)自動駐留,需要自動加載并執(zhí)行該程序。在網(wǎng)絡(luò)平安的編程中,有兩種方法可以解決:一是手動改寫注冊表的啟動項;二是讓該程序和用戶的某一種操作關(guān)聯(lián)。比如:當計算機中了“冰河”以后,當用戶雙擊擴展名為txt的文本文件時,自動加載“冰河”程序。例題:“冰河”原型:方法1第一種方法實現(xiàn)起來比較簡潔,注冊表的啟動項的鍵值在“HKEY_CURRENT_USER”主鍵下的“Software\Microsoft\Windows\CurrentVersion\Run”子鍵中,如圖5.1.53所示。圖5.1.53可以利用手動添加或者程序添加一個鍵值,單擊鼠標右鍵,選擇“字串值選項”,鍵值的名稱一般與可執(zhí)行文件的文件名相同(本例為:Mytest),然后添加可執(zhí)行文件所在的路徑即可。也可以利用程序來修改注冊表的值。方法2其次種方法比較煩瑣些,但是可以實現(xiàn)?!氨印背绦?qū)⒆约号c文本文件的打開方式相關(guān)聯(lián),關(guān)聯(lián)的方法就是使用注冊表“HKEY_CLASSES_ROOT”主鍵下的“\txtfile\shell\open\command”鍵。程序要實現(xiàn)的功能是:當用戶雙擊打開一個文本文件時,啟動駐留的程序。該程序最關(guān)鍵的地方在于用戶雙擊的文本文件地址如何通過駐留程序傳遞給記事本。實現(xiàn)的方法如下程序所示。例題名稱:自動內(nèi)存駐留程序的編寫程序名稱:test.exeusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Threading;usingSystem.Diagnostics;usingMicrosoft.Win32;namespacetest{staticclassProgram{///<summary>///應用程序的主入口點。///</summary>[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Test();}privatestaticvoidMyTest(){//注:拷貝自身到系統(tǒng)名目下stringstr=System.Environment.SystemDirectory;//取操作系統(tǒng)路徑//獵取啟動了應用程序的可執(zhí)行文件的路徑,包括可執(zhí)行文件名stringstrSousrce=System.Windows.Forms.Application.ExecutablePath;inti=strSousrce.LastIndexOf('\\');stringsub=strSousrce.Substring(i,strSousrce.Length-i);//截取可執(zhí)行文件的文件名stringstrDest=str.Insert(str.Length,sub);//連接字符串if(!File.Exists(strDest)){File.Copy(strSousrce,strDest);//拷貝文件到系統(tǒng)名目}//注:將其自身程序設(shè)置為開機啟動RegistryKeyrKey;rKey=Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);boolbol=false;foreach(stringsinrK
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022-2027年中國企業(yè)直播服務(wù)行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略研究報告
- 國學社申請書
- 物流搬運車行業(yè)深度研究報告
- 2025年度智能辦公系統(tǒng)開發(fā)與實施合同規(guī)范
- 2025-2030年中國摩托車后腰臂行業(yè)深度研究分析報告
- 2025年中國汽車用品行業(yè)市場發(fā)展現(xiàn)狀及投資策略咨詢報告
- 2024年建筑方案設(shè)計上會報告(三)
- 農(nóng)村大病申請書
- 2025年鑲嵌粉項目投資可行性研究分析報告
- 2025年度高科技合伙公司入伙協(xié)議書(生態(tài)農(nóng)業(yè)專版)
- 銷售人員薪資提成及獎勵制度
- 2023年宏觀經(jīng)濟學考點難點
- 先兆流產(chǎn)課件-課件
- 黑龍江申論真題2021年(鄉(xiāng)鎮(zhèn))
- 山體排險合同模板
- 醫(yī)保專(兼)職管理人員的勞動合同(2篇)
- 特殊感染手術(shù)的配合與術(shù)后處理課件
- 檢驗科生物安全工作總結(jié)
- 《ESPEN重癥病人營養(yǎng)指南(2023版)》解讀課件
- 《金屬與石材幕墻工程技術(shù)規(guī)范》jgj1332001-2021112401384
- 即時通訊系統(tǒng)建設(shè)方案
評論
0/150
提交評論