在.Net中跨Internet的文件加密傳輸實現每天數據庫的備份

接到一個任務,有2臺機器,其中有一臺機器A有每天數據庫的備份,我想另外的一臺機器B定時從A中copy到B的制定目錄,A不共享數據庫備份的目錄。考慮到FTP方式無法跨越NAT(網絡地址轉換),而HTTP方式在安全性和可靠性方面都得不到保證,在文件較大時也會有一定的限制。決定採用一種基於HTTP協議,編寫客戶端和服務器端程序,在一個客戶端用HttpWebRequest對象向指定的URL發送POST和GET請求,在服務器端通過程序接受請求,進行文件傳輸,這樣,發送和接收都由自己編寫的程序進行控制,可以方便地實現諸如身份驗證、數據加密和斷點續傳等功能,同時可以穿越防火牆和NAT。這樣做就可以實現在.Net中跨Internet的文件加密傳輸。

在.net中實現跨Internet的文件加密傳輸的程序源碼
 
一、數據上傳
1.客戶端代碼
 
//從文本框中獲得文件的全稱,含路徑名
string strFilePath=txUpFile.Text;
//獲得文件的長度
FileInfo fi=new FileInfo(strFilePath);
long lFileLength=fi.Length;
//獲得文件名 
string strFileName=strFilePath.Substring(strFilePath.LastIndexOf("//")+1); 
//創建HttpWebRequest對象,傳入路徑名,將文件名和長度作爲參數傳給服務器端
HttpWebRequest objRequest=(HttpWebRequest)HttpWebRequest.Create(string.
    Format(@"{0}?FileName={1}&FileLength={2}",txUpURL.Text,strFileName,
    lFileLength.ToString()));
//定義Request對象的方法爲"post"
objRequest.Method="POST";
//定義Request對象的內容類型爲"application/octet-stream"
objRequest.ContentType="application/octet-stream";
//定義請求內容的長度
objRequest.ContentLength=((int)(lFileLength/8+1))*8;
//定義一個請求的流
Stream reqStream=objRequest.GetRequestStream();
//用DES算法加密此請求流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();

CryptoStream encStream=new CryptoStream(reqStream,des.CreateEncrytor(desKey,desIV),CryptoStreamMode.Write);

//定義內存緩衝區用於文件的讀寫

int iBufferSize=4095;
byte[] buffer=new byte[iBufferSize];
//打開文件,準備讀取
FileStream fileStream=new FileStream(strFilePath,FileMode.Open,FileAccess.Read);
int iReadLength=0;
//將文件內容讀入緩衝區

iReadLength=fileStream.Read(buffer,0,buffer.Length);

while(iReadLength!=0) {

    //將讀出的文件內容寫入加密流

    encStream.Write(buffer,0,iReadLength);

    iReadLength=fileStream.Read(buffer,0,buffer.Length);

}

//關閉請求的流

encStream.Close();

reqStream.Close();

fileStream.Close();

//向服務器提出請求並獲得結果3

HttpWebResponse sp=(HttpWebResponse)objRequest.GetResponse();

string strContent="";

int iLen=(int)sp.ContentLength;

if(iLen>0) {

    //將結果流寫入到二進制流bContent中

    Stream resStream=sp.GetResponseStream();

    byte[] bContent=new byte[sp.ContentLength];

    resStream.Read(bContent,0,iLen);

    sp.Close();

    //由於結果是一個二進制數據,必須將結果解碼成字符串

    char[] charContent=new char[sp.ContentLength];

    Text.Decoder dc=Text.Encoding.UTF8.GetDecoder();

    int charLen=dc.GetChars(bContent,0,bContent.Length,charContent,0);

    foreach(char c in charContent) strContent+=c.ToString();

}

 

2.服務器端代碼

//判斷請求的ContentType,過濾非法請求

if(Request.ContentType!="application/octet-stream") return;

//獲得上傳得文件名和長度

string strFileName=Request.QueryString["FileName"];

int iFileLength=Request.TotalBytes;

//構造服務器端文件名

string strFilePath=Server.MapPath(".")+IO.Path.DirectorySeparatorChar+"Upload"+IO.Path.DirectorySeparatorChar+strFileName;

//判斷文件是否存在

if(File.Exists(strFilePath)) {

    //如果文件存在,返回文件名和文件長度

    FileInfo fi=new FileInfo(strFilePath);

    long lFileLength=fi.Length;

    Response.Write("File["+strFileName+"]Exists!Length="+lFileLength.ToString());

    Response.End();

}

//如果文件不存在,打開文件流創建該文件

FileStream fileStream=File.Create(strFilePath,iFileLength);

//用DES算法解密該文件流

byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream desStream=new CryptoStream(fileStream,des.CreateDecryptor(desKey,desIV),CryptoStreamMode.Write);
//定義內存緩衝區大小
int iBufferSize=4095;
//讀取請求流並寫入文件中
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
iReadLength=Request.InputStream.Read(buffer,0,buffer.Length);
while(iReadLength>0) {
    desStream.Write(buffer,0,iReadLength);
    desStream.Flush();
    iReadLength=Request.InputStream.Read(buffer,0,buffer.Length);
}
desStream.Flush();
desStream.Close();
fileStream.Close();
//返回結果
Response.Write("File["+strFileName+"]UploadSuccess!");
Response.End();
 
二、數據下載
1.客戶端代碼
//獲取下載文件名
string strFileName=txDownFile.Text;
//定義文件偏移量
int iOffset=0;
//創建HttpWebRequest對象,傳入路徑名,將文件名和偏移量作爲參數傳給服務器
HttpWebRequest objRequest=(HttpWebRequest)HttpWebRequest.Create(string.
    Format(@"{0}?FileName={1}&Offset={2}",txDownURL.Text,strFileName,iOffset));
//定義Request對象的方法爲"get"
objRequest.Method="GET";
//定義Request對象的內容類型爲"application/octet-stream"
objRequest.ContentType="application/octet-stream"
//獲得請求結果
HttpWebResponse sp=(HttpWebResponse)objRequest.GetResponse();
Stream resStream=sp.GetResponseStream();
string strFilePath=txDownPath.Text;
//如果文件存在,則刪除
if(File.Exists(strFilePath)) {
    File.Delete(strFilePath);
}
//創建文件
int iBufferSize=4095;
FileStream fileStream=File.Create(strFilePath);
//解密返回的流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream decStream=new CryptoStream(resStream,des.CreateDecryptor(desKey,desIV),CryptoStreamMode.Read);
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
//讀取返回流
iReadLength=decStream.Read(buffer,0,buffer.Length);
while(iReadLength>0) {
    //寫入文件流中
    fileStream.Write(buffer,0,iReadLength);
    iReadLength=decStream.Read(buffer,0,buffer.Length);
}
fileStream.Flush();
decStream.Close();
fileStream.Close();
resStream.Close();
return "File["+strFileName+"]Download Success!";

2.服務器端代碼

//獲得上傳的文件名和偏移量

string strFileName=Request.QueryString["FileName"];

long lOffset=Convert.ToInt64(Request.QueryString["Offset"]);

//構造文件全路徑名

string strFilePath=Server.MapPath(".")+IO.Path.DirectorySeparatorChar+"Download"+IO.Path.DirectorySeparatorChar+strFileName;

//若文件不存在,則返回錯誤信息

if(!File.Exists(strFilePath)) {

    Response.Clear();

    Response.Write("File["+strFileName+"]Not Exists!");

    Response.End();

}

//打開文件

IO.FileStream fileStream=new IO.FileStream(strFilePath,IO.FileMode.Open,IO.FileAccess.Read,IO.FileShare.Read);

//根據上傳的偏移量參數設置偏移量

if(lOffset>0)

fileStream.Seek(lOffset,IO.SeekOrigin.Begin);

//定義輸出流

Stream resStream=Response.OutputStream;

//用DES算法加密此數據流

byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream encStream=new CryptoStream(resStream,des.CreateDecryptor(desKey,desIV),CryptoStreamMode.Write);
//定義輸出文件流的頭
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachment;filename="+strFileName);
int iBufferSize=4095;
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
//讀取文件
iReadLength=fileStream.Read(buffer,0,buffer.Length);
while(iReadLength>0) {
    //寫入輸出流
    encStream.Write(buffer,0,iReadLength);
    iReadLength=fileStream.Read(buffer,0,buffer.Length);
}
encStream.Flush();
resStream.Flush();
//關閉流
encStream.Close();
resStream.Close();
fileStream.Close();
//Response.Flush();
//結束輸出
Response.End();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章