#ifndef signature_h
#define signature_h
#include
#pragma warning(disable:4996)
/*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
******
* 函式名:signhash
* 功 能:對一段資料進行雜湊簽名,並匯出公鑰
* 參 數:char pdata(in) //想要進行雜湊簽名的資料
dword dwdatalen(in) //資料長度
byte **psignature(out) //雜湊簽名資料的位址,使用完後由呼叫者釋放
dword *dwsiglen(out) //簽名實際長度
byte **ppublickey(out) //公鑰資料的位址,使用完後由呼叫者釋放
dword *depublickeylen(out) //公鑰實長度
* 返回值:bool,ture為簽名成功,false為簽名失敗
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*******/
bool signhash(char *pdata,dword dwdatalen,byte *
*psignature,dword *dwsiglen,byte **ppublickey,dword *dwpublickeylen);
/*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
******
* 函式名:verifsignature
* 功 能:對一段資料進行簽名驗證
* 參 數:char *pdata(in) //想要進行雜湊驗證的資料
dword dedatalen(in) //資料長度
byte *psignature(in) //簽名
dword desiglen //簽名長度
byte *ppublickey //公鑰
dword dwpublickeylen //公鑰長度
* 返回值:bool,ture為驗證簽名成功,false為驗證簽名失敗
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
***/
bool verifsignature(char *pdata,dword dwdatalen,byte *psignature,dword dwsiglen,byte *ppublickey,dword dwpublickeylen);
#endif
#include "stdafx.h"
#include "signature.h"
#include
#include
using
namespace
std;
int main()
bool signhash(char *pdata,dword dwdatalen,byte **psignature,dword *dwsiglen,byte **ppublickey,dword *dwpublickeylen)
}//2.獲取簽名秘鑰
hcryptkey hkey;
res=cryptgetuserkey(hcryptprov,at_signature,&hkey);
if(!res) //沒有可用的簽名秘鑰
}//3.匯出公鑰
if (cryptexportkey(hkey,null,publickeyblob,0,null,dwpublickeylen))
printf("獲取公鑰長度成功!\n");
else
printf("獲取公鑰失敗!\n");
if(*ppublickey=(byte*)malloc(*dwpublickeylen)) //開闢公鑰長度空間
printf("開闢公鑰長度空間成功!\n");
else
printf("開闢公鑰長度空間失敗!\n");
if (cryptexportkey(hkey,null,publickeyblob,0,*ppublickey,dwpublickeylen))
printf("匯出公鑰成功!\n");
else
printf("匯出公鑰失敗!\n");
//4.對資料進行雜湊簽名
//(1)建立hash物件,並將資料加到hash物件中
hcrypthash hhash;
if(cryptcreatehash(hcryptprov,calg_sha1,0,0,&hhash)) //建立乙個hash物件
printf("建立雜湊簽名成功!\n");
else
printf("建立雜湊簽名失敗!\n");
if(crypthashdata(hhash,(const byte *)pdata,dwdatalen,0)) //對一塊資料進行雜湊,把它加到指定的雜湊物件中
printf("將資料進行雜湊成功!\n");
else
printf("將資料進行雜湊失敗!\n");
//(2)獲取簽名長度
if (cryptsignhash(hhash,at_signature,null,0,null,dwsiglen))
printf("獲取簽名資料長度成功!\n");
else
printf("獲取簽名資料長度失敗!\n");
if (*psignature=(byte*)malloc(*dwsiglen))
printf("開闢簽名資料長度的空間成功!\n");
else
printf("開闢簽名資料長度的空間失敗!\n");
if(cryptsignhash(hhash,at_signature,null,0,*psignature,dwsiglen))
printf("簽名成功!\n");
else
//5.釋放空間
if(hkey)
cryptdestroykey(hkey);
if(hhash)
cryptdestroyhash(hhash);
if(hcryptprov)
cryptreleasecontext(hcryptprov, 0);
return true;
}bool verifsignature(char *pdata,dword dwdatalen,byte *psignature,dword dwsiglen,byte *ppublickey,dword dwpublickeylen)
}//2.匯入公鑰
hcryptkey hpubkey;
if(cryptimportkey(hcryptprov,ppublickey,dwpublickeylen,0,0,&hpubkey))
printf("匯入公鑰成功!\n");
else
printf("匯入公鑰失敗!\n");
//3.計算雜湊
hcrypthash hhash;
if(cryptcreatehash(hcryptprov,calg_sha1,0,0,&hhash))
printf("建立雜湊物件成功!\n");
else
printf("建立雜湊物件失敗!\n");
if(crypthashdata(hhash,(const byte *)pdata,dwdatalen,0))
printf("資料雜湊完成!\n");
else
printf("資料雜湊失敗!\n");
//4.驗證雜湊簽名
if(cryptverifysignature(hhash,psignature,dwsiglen,hpubkey,null,0))
printf("驗證簽名成功!\n");
else
printf("驗證簽名失敗!\n");
//5.釋放空間
if(hhash)
cryptdestroyhash(hhash);
if(hcryptprov)
cryptreleasecontext(hcryptprov,0);
return true;
}
openssl RSA簽名和驗籤
1 近期除錯的乙個客戶端,為了防止介面請求被劫持 篡改,需通過證書對請求資料進行簽名操作,來確保請求資料的完整性 要用私鑰對資料進行rsa簽名,用的sha256withrsa,然後使用 base64 封裝簽名結果,將資料傳送到伺服器,伺服器對資料進行驗籤。2 針對伺服器返回結果資料,客戶端需要進行驗...
ECDSA簽名 驗籤
ecdsa簽名每次結果不同。原因 ecdsa簽名過程中混入隨機值,生成簽名結果不同。公鑰證書驗籤沒問題。1.簽名過程 假設要簽名的訊息是乙個字串 hello world dsa簽名的第乙個步驟是對待簽名的訊息生成乙個訊息摘要。不同的簽名演算法使用不同的訊息摘要演算法。比如,dss使用sha1來生成1...
數字簽名和驗籤
數字簽名使用了公鑰加密領域的技術 通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證。數字簽名是只有資訊的傳送者才能產生的別人無法偽造的一段數字串,這段數字串標明這段資訊是傳送者傳送的。數字簽名是非對稱金鑰加密技術與數字摘要技術的應用。數字簽名的作用 保證資訊傳輸的完整性 數字摘要 確認傳送者的身...