獲取數字簽名

2021-08-18 04:24:24 字數 4865 閱讀 4640

#include 

#include 

#include 

#include 

#include 

#include 

//刪除陣列

#define safedeletearraysize(pdata)  }

#pragma comment(lib, "wintrust.lib") 

#pragma comment(lib, "crypt32.lib")

#define encoding (x509_asn_encoding | pkcs_7_asn_encoding)

//關閉檔案重定向系統

bool

disablewow64fsredirection(

void

)    

}  return

false;  

}  //開啟檔案重定向系統

bool

revertwow64fsredirection(

void

)    

}  return

false;  

}  //帶重定向開啟檔案

bool

redirectioncreatefile(

const

wchar_t

* pfilepath, 

handle

& hfile)  

//開啟檔案重定向系統

if(bdisablewow64fsredirection)  

return

bret;  

}  //獲取檔案數字簽名

wchar_t

* getcertname(

wchar_t

* pfilepath)  

doclosehandle(hfile);  

cert_blob object = ;  

object.cbdata = dwfilesize;  

object.pbdata = pbuff;  

bresult = cryptqueryobject(cert_query_object_blob, &object  

, cert_query_content_flag_pkcs7_signed_embed, cert_query_format_flag_binary  

, 0, &dwencoding, &dwcontenttype, &dwformattype, &hstore, &hmsg, null);  

if(!bresult)  

if(!bresult)

break

;  }         

bresult = cryptmsggetparam(hmsg, cmsg_signer_info_param, 0, null, &dwsignerinfo);  

if(!bresult)

break

;  psignerinfo = (pcmsg_signer_info) new

char

[dwsignerinfo];  

if(null == psignerinfo)

break

;  zeromemory(psignerinfo, dwsignerinfo);  

bresult = cryptmsggetparam(hmsg, cmsg_signer_info_param, 0, (pvoid

)psignerinfo, &dwsignerinfo);  

if(!bresult)

break

;  certinfo.issuer = psignerinfo->issuer;  

certinfo.serialnumber = psignerinfo->serialnumber;  

pcertcontext = certfindcertificateinstore(hstore, encoding, 0, cert_find_subject_cert, (pvoid

)&certinfo, null);  

if(null == pcertcontext)

break

;  dwdata = certgetnamestring(pcertcontext, cert_name_******_display_type, 0, null, null, 0);  

if(1 >= dwdata)  

break

;  pcertname = new

wchar_t

[dwdata + 1];  

if(null == pcertname)

break

;  zeromemory(pcertname, (dwdata + 1) * sizeof

(wchar_t

));  

if(!(certgetnamestring(pcertcontext, cert_name_******_display_type, 0, null, pcertname, dwdata)))  

break

;  } while

(false);  

safedeletearraysize(pbuff);  

safedeletearraysize(psignerinfo);  

if(pcertcontext != null) certfreecertificatecontext(pcertcontext);  

if(hstore != null) certclosestore(hstore, 0);  

if(hmsg != null) cryptmsgclose(hmsg);  

return

pcertname;  

}  //檢測檔案是否有簽名

wchar_t

* getfilecat(

wchar_t

* lpfilename)  

;  wintrust_file_info wfi = ;  

wintrust_catalog_info wci = ;  

catalog_info ci = ;  

hcatadmin hcatadmin = null;  

handle

hfile = invalid_handle_value;  

dword

dwcnt = 0;  

pbyte

pbyhash = null;  

wchar_t

* pszmembertag = null;  

hcatinfo hcatinfo = null;  

hresult

hr;  

static

guid action = wintrust_action_generic_verify_v2;  

const

guid gsubsystem = driver_action_verify;  

wchar_t

* pcatalogfile = null;  

do  

}  else

closehandle(hfile);  

hcatinfo = cryptcatadminenumcatalogfromhash(hcatadmin, pbyhash, dwcnt, 0, null);  

if(null == hcatinfo)  

else

wci.cbstruct = sizeof

(wintrust_catalog_info);  

wci.pcwszcatalogfilepath = ci.wszcatalogfile;  

wci.pcwszmemberfilepath = lpfilename;  

wci.pcwszmembertag = pszmembertag;  

wd.cbstruct = sizeof

(wintrust_data);  

wd.pcatalog = &wci;  

wd.dwuichoice = wtd_ui_none;  

wd.dwunionchoice = wtd_choice_catalog;  

wd.fdwrevocationchecks = wtd_stateaction_verify;  

wd.dwstateaction = wtd_stateaction_verify;  

wd.dwprovflags = 0;  

wd.hwvtstatedata = null;  

wd.pwszurlreference = null;  

}  }  

hr = winverifytrust((hwnd

)invalid_handle_value, &action, &wd);  

if(succeeded(hr) || wcslen(ci.wszcatalogfile) > 0)  

if(null != hcatinfo)  

} while

(false);  

if(hcatadmin)  

safedeletearraysize(pbyhash);  

safedeletearraysize(pszmembertag);  

return

pcatalogfile;  

}  //獲取檔案數字簽名

wchar_t

* getfilecertname(

wchar_t

* pfilepath)  

}  safedeletearraysize(pcatfilepath);  

return

pcertname;  

}  int

main(

void

)    

Android Studio獲取數字簽名

之前用eclipse時,應用的簽名直接就可以視覺化檢視 但是android stduio這點就比較特殊,不能直接視覺化查詢。不過也存在多種查詢方式,這次我介紹一種最常見的 命令列查詢 第一步 開啟cmd 第二步 cd android 進入到.android 目錄 第三步 出現 輸入秘鑰庫口令 網上很...

數字簽名簽名概述

數字簽名的技術流程描述 1 傳送者使用摘要演算法對傳送資訊產生資訊摘要 2 傳送者使用自己的私鑰對資訊摘要進行簽名 3 傳送者將資訊本身和已簽名的摘要一起傳送出去 4 接收者使用相同的摘要演算法對資訊本身計算資訊摘要 5 接收者使用傳送者的公鑰對簽名的摘要就行驗籤,獲得資訊傳送者的資訊摘要 6 接收...

數字信封 數字簽名

2019 08 06 19 51 51 數字簽名是用來表明資料傳送者身份的,有了簽名就說明這個資料是傳送都發出來的。為什麼?因為可以用你的公鑰開啟你的簽名資訊,獲取明文的hash值。數字信封,被公鑰加密後的對稱密碼被稱為數字信封,用於對稱金鑰的交換。數字證書,用來證明資料傳送者的身份的。為什麼能證明...