程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 模擬信息加密流程圖簡介

模擬信息加密流程圖簡介

編輯:關於C++

Encryption_Demo 代碼模擬了圖一和圖二的流程圖內容,但僅僅只是模擬,談不上什麼應用;其應用過程限於程序間的傳遞過程,沒有涉及到網絡間數據傳輸,所以僅僅是模擬其過程而已。

圖一 采用安全認證的信息加密流程圖

圖二 采用安全認證技術的信息解密過程圖

圖三 采用安全認證的信息加密流程圖文字說明

圖四 采用安全認證技術的信息解密過程圖的文字說明

Encryption_Demo 代碼沒有什麼新奇之處。發布的目的在於使大家了解“采用安全認證的信息加密流程圖”的運作過程。代碼,大家可以下載看一看。下面我要說的是,最主要的工作體現在字節數組的偏移量的計算上。比如在本程序中采用MD5散列,其散列值固定長度16個字節;采用DES算法分組加密,其Key和IV字節數都為8個字節;采用RSA進行簽名,簽名長度固定為128個字節,而加密結果的長度呢,我們要加密的字節數組長度為128+8+8 = 144,那麼RSA非對稱加密後的字節數長度就為1152個字節長度。那麼,在第一個流程圖中,合並後的整個密文數據字節長度,我們知道不固定,可是它的第一部分和第三部分長度是固定的(再強調一次,我們這裡使用DES分組加密算法,MD5散列函數,RSA方法簽名和加密,下面分析結果也都是建立這基礎上的)。比如:

加密後的會話密文 —— RsaEncryptData :1152

摘要簽字 —— CombinData : 144

我們可以獲得整個要截密文件的長度string fileName = OpenFile("請打開要解密的文件:");
FileStream fs = new FileStream(fileName,FileMode.Open,FileAccess.Read);

(int)fs.Length - 1152-144 運算結果就是中間密文---EncryptionDate 的長度。解密中間密文後,緊接著就要處理時間戳啦。我們分析時間戳的字節數組組成吧:

文件散列長度 :16
接收時間 :23
簽名長度 :128
總共長度 :167

既然知道這些字節數組的組成,你該知道怎麼做了吧?關於處理接收時間戳的處理上,有點要注意的:

public static byte [] GetTimeNow()
{
  //這樣轉化成的格式為:2004-11-09 13:04:28-108 23個字節
  DateTime now = DateTime.Now;
  System.Text.UTF8Encoding utf = new System.Text.UTF8Encoding();
  
  string month = null ;
  if(now.Month<10)
    month = "0"+now.Month.ToString();
  else
    month = now.Month.ToString();
  
  string day = null;
  if(now.Day<10)
    day = "0" + now.Day.ToString();
  else
    day = now.Day.ToString();
  
  string millisecond = null;
  if(now.Millisecond<10)
    millisecond = "00"+now.Millisecond.ToString();
  if(now.Millisecond>=10&&now.Millisecond<=99)
    millisecond = "0" + now.Millisecond.ToString();
  if(now.Millisecond>=100)
    millisecond = now.Millisecond.ToString();
  string FullFormatTime = now.Year.ToString() +
                 "-" + month + "-" +
                 day + " " +
                 now.ToLongTimeString() + "-" + millisecond ;
  //比如:2004-11-09 13:04:28-108
  return utf.GetBytes( FullFormatTime );    
}

這樣處理後的結果是接收時間精確到毫秒,且固定字節長度為23個字節。我們把第一個流程圖的結果寫進文件中去(其路徑與你要加密的原始明文在同一目錄下,主要是為了儲存的方便),而流程圖二的解密結果則保存在bin\Release目下。這樣解密時需要讀取文件,這裡提供了兩種方法,第一種把文件內容讀取到一個數組裡面,另外一種是需要時直接從文件中提取的指定的字節數組。第一種方法把文件內容讀取到一數組,解密時分解數組,使用Buffer.BlockCopy( )函數分解既可。比如,從fileContent數組中偏移量1152處開始復制“length”長度字節復制到一個新的數組“Encrypt_Two”中去。int length = (int)fs.Length-1296;// -1152-144 ; //密文的長度AllEncryptedData
Encrypt_Two = new byte[ length ];
Buffer.BlockCopy(fileContent,1152,Encrypt_Two,0,length);

而采用第二種方法:

Encrypt_One = new byte[1152];
fs.Read(Encrypt_One,0,1152);

這樣直接從文件流開始位置讀取 1152 個字節到數組“Encrypt_One”中。但如果要提取字節不是從起點開始,那就需要設置文件流的位置:

//讀取加密的明文
int length = (int)fs.Length-1296;// -1152-144 ; //密文的長度 AllEncryptedData
Encrypt_Two = new byte[ length ];
fs.Position = 1152 ; //文件流偏移位置了1152個字節
fs.Read(Encrypt_Two,0,length);

注意了fs.Read()方法內參數的表示啦,而這樣表達:fs.Read(Encrypt_Two,length,length),程序會報告文件偏移量出現錯誤。

需要說明的是,在設計代碼時,把主窗體程序所能使用到的功能都封裝到一個類裡面,且所有被使用到的函數都是靜態類型,便於使用上的方便。測試程序,需要用到三對鑰匙:發送者(A)、接收者(B)和時間戳服務器(DTS)的各自的私鑰和公鑰。基於流程圖一,你使用時間戳服

務器私鑰一次,A的私鑰兩次,B的公鑰一次。基於流程圖二,你使用時間戳服務器公鑰一次,A的公鑰兩次,B的私鑰一次。至於測試所用到鑰匙,你可以在壓縮包Encryption Demo\bin\Release目錄可以看到三個文件夾,裡面分別存放著發送者(A)、接收者(B)和時間戳服務器(DTS)的各自的鑰匙。當然你也可以自己生成鑰匙,點擊“產生一對鑰匙”按鈕,見下圖:

那麼產生的鑰匙你可以在程序的bin\Release目錄下找到。那麼怎麼使用本程序呢,你可以使用已經准備好的三對公鑰,按照下圖圖示即可:

1、“打開文件”—選擇你要加加密的文件,點擊下面的“提交到DTS服務中心...”按鈕。

2、點擊選項卡“加密步驟二”,直接點下面的按鈕“開始以上步驟”,這中間會要求你打開鑰匙文件,別搞錯啊。

3、最後一個選項卡,“開始解密”按鈕,你也知道怎麼做吧 :)

注:這中間會出現對話框要求你打開密鑰文件,可別選擇錯啊,要不,不會出現預期的目標。之所以這樣做,本身就要你注意區分密鑰與密鑰的不同(要不,不能體現本程序的編寫的意圖。你說呢~!?J)。當然大家也可以自己使用更好對稱加密算法、散列函數,比如 Rijndeal 對稱加密算法、SHA512等,那就需要你重新計算這其中的字節偏移量啦(可有償定制)。時間不充分哦,代碼和注釋寫得有些亂,請湊合著看啦 J Bye_Bye !

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved