用C++Builder建立數字簽名 (轉)

worldblog發表於2007-12-06
用C++Builder建立數字簽名 (轉)[@more@]

用C++Builder建立數字簽名

  如果你在遞一份資料,但卻存在著種種不的因素,使你對資料能否原封不動地到達目的地而心存疑惑,這時,你就可以給資料加上數字簽名,從而使對方可以透過驗證簽名來檢查你所傳過去的資料是否已被他人修改。

    一、原理
    數字簽名的工作原理還是比較簡單的,它是根據你所提供的原始資料,經過複雜的演算法,產生特定的資料簽名,對方透過同樣的過程也產生簽名,如果資料已被修改,那麼就不可能得到兩份一模一樣的簽名,從而就可判斷資料已被他人修改。人員利用的C介面,就可以實現資料的、和數字簽名。  

    二、程式清單

    下面用C++Builder的語句來看一下它的具體實現過程。
 
   先來建立數字簽名,假定其資料來自於一個。

    //變數宣告:
    HCRYPTPROV hProv;
    // CSP的控制程式碼
    HCRYPTHASH hHash;
    //雜湊的控制程式碼
    const int BUFFER=4096;
    //緩衝區大小常數
    BYTE pBuffer[BUFFER];    
    //存放讀檔案內容的緩衝區
    BYTE pSignature[256];
    //存放簽名的緩衝區
    D dSignatureLen=256;
    //簽名的長度
    TFileStream*File;
    //一個檔案流
    if(!CryptAcquireContext(&hProv,NULL,NULL,PROV—RSA—FULL,0))
    //連線預設的CSP,接受它的控制程式碼放入hProv
   {    
       //錯誤處理
     }
    if(!CryptCreateHash(hProv,CALG—MD5,0,0,&hHash))
    //建立一個雜湊,得到它的控制程式碼放入hHash
   {
       //錯誤處理
 }
    do
     {
     dReadLen=sourceFile->Read(pBuffer,BUFFER);
     if(!CryptHashData(hHash,pBuffer,dReadLen,0))
     //根據檔案的內容計算雜湊值
   {
     //錯誤處理
     }
   }while(!(dReadLen    if(!CryptSignHash(hHash,AT—SIGNATURE,NULL,0,pSignature,&dSignatureLen))
    //使用私人金鑰對雜湊值進行數字簽名
    //簽名資料放入pSignature,長度放入dSignatureLen
     //錯誤處理
    }

    對基於檔案的資料簽名進行檢驗。
    //變數宣告:
    HCRYPTPROV hProv;
    // CSP的控制程式碼
    HCRYPTHASH hHash;
    //雜湊的控制程式碼
    HCRYPTKEY hPublicKey;    
    //公共金鑰的控制程式碼
    const int BUFFER=4096;  
    //緩衝區大小常數
    BYTE pBuffer[BUFFER];    
    //存放讀檔案內容的緩衝區
    TFileStream*sourceFile;//一個檔案流
    BYTE pSignature[256];    
    //上一段得到的簽名的緩衝區
    DWORD dSignatureLen;    
    //上一段得到的簽名的長度
    if(!CryptAcquireContext(&hProv,NULL,NULL,PROV—RSA—FULL,0))
    //連線預設的CSP,接受它的控制程式碼放入hProv
    {
   //錯誤處理
 }
    if(!CryptGetUserKey(hProv,AT_SIGNATURE,&hPublicKey);
    //得到公共金鑰的控制程式碼
     {
       //錯誤處理
     }
    if(!CryptCreateHash(hProv,CALG—MD5,0,0,&hHash))
   //建立一個雜湊物件,得到它的控制程式碼放入hHash
    {
       //錯誤處理
     }
    do
     {
     dReadLen=sourceFile->Read(pBuffer,BUFFER);
    if(!CryptHashData(hHash,pBuffer,dReadLen,0))
   //根據檔案的內容計算雜湊值
     {
 //錯誤處理
     }
     }while(!(dReadLen    if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))
     {
       if(GetLastError()==NTE—BAD—SIGNATURE) 
   ShowMessage(″檔案已被修改″);
     }
    else
     {
    ShowMessage(″檔案沒被修改″);
    }
    以上是一個數字簽名的簡單實現,得到的簽名資料可以單獨儲存,也可以分開儲存。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988906/,如需轉載,請註明出處,否則將追究法律責任。

相關文章