將憑證資料輸出 |
尚未結案
|
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
各位前輩好:
小弟目前有幾個憑證,那應該要怎嚜將憑證的資料(序號、姓名、EMAIL、...等)轉成明文顯示在螢幕上呢?小弟看過這篇文章,RaynorPao 前輩要求先看過M$ Crypto API ,小弟去查過之後,還是不太清楚該怎嚜下手去寫,請問可否請各位前輩開個頭,指引小弟該怎嚜撰寫!?
http://delphi.ktop.com.tw/topic.php?topic_id=40513
感謝各位前輩 **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
http://delphi.ktop.com.tw/topic.php?topic_id=29414
以 Windows CryptoAPI 實做 BCB_Delphi 檔案字串加解密
發表人:bruce0211 http://delphi.ktop.com.tw/topic.php?topic_id=46688
【BCB】【問題】字串加密傳送
答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=46348
【BCB】【問題】有關CryptoAPI中的加解密方式~~
答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=42038
【BCB】【問題】加密問題...
答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=30028
【BCB】【問題】如何為 XML 文件加密
答題得分者為:taishyang
http://delphi.ktop.com.tw/topic.php?topic_id=25183
【BCB】【問題】加解密API
答題得分者為:RaynorPao 以上為BCB本園地搜尋所得到結果
請參考 Andy Chang
------
Andy Chang |
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
引言: http://delphi.ktop.com.tw/topic.php?topic_id=29414 以 Windows CryptoAPI 實做 BCB_Delphi 檔案字串加解密 發表人:bruce0211 http://delphi.ktop.com.tw/topic.php?topic_id=46688 【BCB】【問題】字串加密傳送 答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=46348 【BCB】【問題】有關CryptoAPI中的加解密方式~~ 答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=42038 【BCB】【問題】加密問題... 答題得分者為:RaynorPao http://delphi.ktop.com.tw/topic.php?topic_id=30028 【BCB】【問題】如何為 XML 文件加密 答題得分者為:taishyang http://delphi.ktop.com.tw/topic.php?topic_id=25183 【BCB】【問題】加解密API 答題得分者為:RaynorPao 以上為BCB本園地搜尋所得到結果 請參考 Andy Changandychang1690您好: 感謝您的回應,您的指引讓小弟在目前的傳輸加解密上有很大的幫助! 可是小弟在這裡是希望能將憑證 > **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻** |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
dean: http://delphi.ktop.com.tw/topic.php?topic_id=29414 以 Windows CryptoAPI 實做 BCB_Delphi 檔案字串加解密 發表人:bruce0211 中範例非常清楚簡單 http://delphi.ktop.com.tw/loadfile.php?TOPICID=9364660&CC=209440 下載的檔案CryptSample.zip中 // 字串加密 bool __fastcall TForm1::EnCryptStr(char *SourStr,char *DestStr,char *StrPassword) // 字串解密 bool __fastcall TForm1::DeCryptStr(char *SourStr,char *DestStr,char *StrPassword) 其中bruce0211聲明導入密碼會影響大小,所以 void __fastcall TForm1::Button4Click(TObject *Sender) { char tmp_buf[65535]; AnsiString a="123"; // 加密時導入密碼 EnCryptStr(Memo1->Text.c_str(),tmp_buf,a.c_str()); Memo2->Text=tmp_buf; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { char tmp_buf[65535]; AnsiString a="123"; // 解密時導入密碼 DeCryptStr(Memo2->Text.c_str(),tmp_buf,a.c_str()); Memo3->Text=tmp_buf; } 好!現在你要引用 序號、姓名、EMAIL、...等)轉成明文顯示在螢幕上!如同你建立一個INI檔 [A] SN= NAME= EMAIL= 你只需要經過上述EnCryptStr()將加密字串存入即可。 如原本SN=1111,NAME=Andy Chang,EMAIL=andychang@3388.com 經過EnCryptStr()成為 SN=5036B4CE,NAME=2069E1868E7E07BCF5CA,EMAIL=0069E186CD550EB3FCED9C7D51E575F2CF80 讀出INI再經過DeCryptStr()解密即可,INI檔的檔名不限一定是.ini 請參考!Andy Chang
------
Andy Chang |
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
上面兩位先進似乎有點誤會dean兄想要問的問題了^^;
dean兄只是很簡單的想把在csertificate store裡面的
憑證open然後把憑證主旨裡面的東西(X.509 V3格式的
話應該就是最後面的ext部分)show出來而已:)
只是在下不清楚dean兄的憑證是從何處讀取出來?
若是想如同IE那樣有UI介面可以選擇而且還是使用Crypto API
的話就有許多限制(例如:OS限定XP以上,2k不行...)
流程的話:
1.使用CertOpenStore()開啟憑證(簡單的CertOpenSystemStore()也行)
2.使用CertFindCertificateInStore()取出想要的那張憑證
3.使用CertGetXXXXXXX()取出憑證裡面各項資料(有很多查一下就有了:p)
基本上這樣就可以read出憑證裡面的資料.
但是這樣作不僅不方便而且想要用OS內建的UI介面還備
受限制,在下雖然之前也是這樣作,但是現在是想改用CAPICOM
的ActiveX元件來作,流程和做法都簡單許多,只是因為
在下功力不足...在BCB上面把capicom.dll當成type libary import
之後呼叫get_Item()都會發生型態錯誤,暫時卡在那裡了^^;
上面一點點心得供您參考! ???
------
??? |
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
引言: 上面兩位先進似乎有點誤會dean兄想要問的問題了^^; dean兄只是很簡單的想把在csertificate store裡面的 憑證open然後把憑證主旨裡面的東西(X.509 V3格式的 話應該就是最後面的ext部分)show出來而已:) 只是在下不清楚dean兄的憑證是從何處讀取出來? 若是想如同IE那樣有UI介面可以選擇而且還是使用Crypto API 的話就有許多限制(例如:OS限定XP以上,2k不行...) 流程的話: 1.使用CertOpenStore()開啟憑證(簡單的CertOpenSystemStore()也行) 2.使用CertFindCertificateInStore()取出想要的那張憑證 3.使用CertGetXXXXXXX()取出憑證裡面各項資料(有很多查一下就有了:p) 基本上這樣就可以read出憑證裡面的資料. 但是這樣作不僅不方便而且想要用OS內建的UI介面還備 受限制,在下雖然之前也是這樣作,但是現在是想改用CAPICOM 的ActiveX元件來作,流程和做法都簡單許多,只是因為 在下功力不足...在BCB上面把capicom.dll當成type libary import 之後呼叫get_Item()都會發生型態錯誤,暫時卡在那裡了^^; 上面一點點心得供您參考!???algo前輩您好: 小弟目前是將憑證存放在某一個資料夾中,然後再利用自己寫的BCB介面去選擇憑證,再將憑證內容讀出,但目前只能讀出序號,而且方法不是正規的!目前我讀出序號的方式是將憑證切換16進制,各位可以將憑證由UtraEdit打開,然後從第十一個開始就是序號的起始點,從那裡開始往後十個都是序號,我適用這種方式去取出的,但這樣並不是正規的讀出方式! algo前輩所說的應該是指IE上選到憑證之後,然後再利用我們的網頁去解開憑證,這個我有試過可以用ASP去完成(資訊全應用系統開發實務書籍-碁峰),但我的應用是想用在我的BCB介面上,請問有辦法嗎? 請問capicom.dll是用來做什麼? 另外您說的三個流程只能用在IEㄇ?用在BCB不行ㄇ? 流程的話: 1.使用CertOpenStore()開啟憑證(簡單的CertOpenSystemStore()也行) 2.使用CertFindCertificateInStore()取出想要的那張憑證 3.使用CertGetXXXXXXX()取出憑證裡面各項資料(有很多查一下就有了:p) **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻** |
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
我查到BCB HELP有這兩個:
File containing the X.509 certificate.
property CertFile: String;
Description
CertFile is a String property that represents the file name that contains the content for the X.509 certificate. File containing the X.509 certificate.
property CertFile: TFileName;
Description
CertFile is a TFileName property that represents the file name that contains the content for the X.509 certificate. 請問這兩個可以應用嗎?property CertFile: String;跟property CertFile: TFileName;又要怎嚜去用?我在BCB宣告都不過!?
另外也查了這兩個相關的!但不知道如何使用!
|
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
To dean:
不知道您是用什麼方法來做!?^^;
就算是把憑證放在檔案中依然可以使用在下所提供的流程
把憑證中的資料取出...
下面是由IE系統中的Sotre取出憑證資料的範例:
void __fastcall TForm1::Button4Click(TObject *Sender) { HCERTSTORE hCertStore; PCCERT_CONTEXT pCertContext = NULL; char pszNameString[256]; if(hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY")) ShowMessage("The MY store is open.\n"); else{ ShowMessage("The MY store can't be open.\n"); return; } //"081902"是要開啟憑證的CommonName pCertContext = CertFindCertificateInStore(hCertStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"081902", pCertContext); if (!pCertContext) ShowMessage("Can't get Certificate context!"); if(CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,pszNameString,128)) ShowMessage(AnsiString(pszNameString)); //Show CN else ShowMessage("CertGetName failed."); if(CertGetNameString(pCertContext,CERT_NAME_EMAIL_TYPE,0,NULL,pszNameString,128)) ShowMessage(AnsiString(pszNameString)); //Show e-amil else ShowMessage("CertGetName failed."); CertFreeCertificateContext(pCertContext); CertCloseStore(hCertStore,0); }您要的是由檔案中取出其實CertOpenSotre()一樣可以做到, 麻煩您參考MSDN中的範例,因為只是把檔案的handle傳進函式 當中而已...在下認為應該難不倒您才是:) if(hFileStore = CertOpenStore( CERT_STORE_PROV_FILE, // Load certificates from a file 0, // Encoding type not used NULL, // Use the default HCRYPTPROV CERT_STORE_READONLY_FLAG, // Read-only store hFile // The handle for the open file // that is the source of the // certificates )) {???
------
??? |
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
引言: To dean: 不知道您是用什麼方法來做!?^^; 就算是把憑證放在檔案中依然可以使用在下所提供的流程 把憑證中的資料取出... 下面是由IE系統中的Sotre取出憑證資料的範例:algo您好: 小弟查了MSDN的範例,但覺得好像少了點什麼?想請問,是不是需要include 什麼檔案才可以使用CertOpenStore,CertGetNameString,CertFindCertificateInStore,CertFreeCertificateContext,CertCloseStore這些function呢?因為我直接COPY您的button4程式至我的button中,但他卻說上面這些function都link error,這是不是代表要include something呢?還是? 謝謝 **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**void __fastcall TForm1::Button4Click(TObject *Sender) { HCERTSTORE hCertStore; PCCERT_CONTEXT pCertContext = NULL; char pszNameString[256]; if(hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY")) ShowMessage("The MY store is open.\n"); else{ ShowMessage("The MY store can't be open.\n"); return; } //"081902"是要開啟憑證的CommonName pCertContext = CertFindCertificateInStore(hCertStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"081902", pCertContext); if (!pCertContext) ShowMessage("Can't get Certificate context!"); if(CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,pszNameString,128)) ShowMessage(AnsiString(pszNameString)); //Show CN else ShowMessage("CertGetName failed."); if(CertGetNameString(pCertContext,CERT_NAME_EMAIL_TYPE,0,NULL,pszNameString,128)) ShowMessage(AnsiString(pszNameString)); //Show e-amil else ShowMessage("CertGetName failed."); CertFreeCertificateContext(pCertContext); CertCloseStore(hCertStore,0); }您要的是由檔案中取出其實CertOpenSotre()一樣可以做到, 麻煩您參考MSDN中的範例,因為只是把檔案的handle傳進函式 當中而已...在下認為應該難不倒您才是:)if(hFileStore = CertOpenStore( CERT_STORE_PROV_FILE, // Load certificates from a file 0, // Encoding type not used NULL, // Use the default HCRYPTPROV CERT_STORE_READONLY_FLAG, // Read-only store hFile // The handle for the open file // that is the source of the // certificates )) {??? |
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
引言: 小弟查了MSDN的範例,但覺得好像少了點什麼?想請問,是不是需要include 什麼檔案才可以使用CertOpenStore,CertGetNameString,CertFindCertificateInStore,CertFreeCertificateContext,CertCloseStore這些function呢?因為我直接COPY您的button4程式至我的button中,但他卻說上面這些function都link error,這是不是代表要include something呢?還是?既然您查過了MSDN,應該有查到上述的函式吧!既然有查到為什麼會沒看到 下面有寫Requirements,然後裡面有寫Header: Declared in XXXXXX.h ? 在下認為這應該是您要能自己找到的. 另外大多數的Windows API在BCB中都能直接使用,因為include windows.h 內包含許多header,您可以自己去看source code. 以上! ???
------
??? |
wooerder
一般會員 發表:2 回覆:7 積分:1 註冊:2003-09-03 發送簡訊給我 |
各位先進你們好
我寫了一個
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hFile=CreateFile( "c:\\Face\\abc.cer",GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,NULL); if(CertOpenStore(
CERT_STORE_PROV_FILE, // Load certificates from a file
0, // Encoding type not used
NULL, // Use the default HCRYPTPROV
CERT_STORE_READONLY_FLAG, // Read-only store
hFile // The handle for the open file
// that is the source of the
// certificates
))
ShowMessage("The abc is open.\n");
else{
ShowMessage("The abc can't be open.\n");
return;
}
} 結果出現
[Linker Error] Unresolved external 'CertOpenStore' referenced from C:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\桌面\轉憑證\NEW2\UNIT1.OBJ
這是代表什麼意思呢?要如何去解決這個錯誤呢?
還有就是algo所用的hFileStore = CertOpenStore
那個hFileStore是什麼型態的東西,我也是不了解。
|
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
引言: [Linker Error] Unresolved external 'CertOpenStore' referenced from C:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\桌面\轉憑證\NEW2\UNIT1.OBJ依照字面意思就是連結不到該函式的程式庫,所以請去BCB6\lib\psdk下面 把Crypt32.lib加入project當中,不要把該目錄加入Lib路徑,因為這樣BCB 還是不會自動幫你連結。 引言: 還有就是algo所用的hFileStore = CertOpenStore 那個hFileStore是什麼型態的東西,我也是不了解。在下之前有說過這些都是Windows API,既然如此 您要的答案都可以在MSDN中獲得.... ???
------
??? |
wooerder
一般會員 發表:2 回覆:7 積分:1 註冊:2003-09-03 發送簡訊給我 |
DEAR algo
經過你的指導~我把檔案的handle傳進函式了,但是在CertOpenStore中還是
傳回NULL值,不知道是我的問題還是說不能用檔案的方式來讀取。
我的憑證是用MS提供的CERTSRV那個網頁所做出來的,在產生的過程中,為了把它用成是一個檔案,就選擇了~web瀏覽器憑證~其他選項~進階憑證要求~將金鑰標示成可匯出 ~將金鑰匯出到檔案 ~在產生憑證後可以下載憑證,並選擇了~DER 編碼~然後存成c:\face\abc.cer
然後就寫了以下的程式
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hFile=CreateFile( "C:\\Face\\abc.cer", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
ShowMessage("The abc can't open\n");
return;
}
else
ShowMessage("The abc is be open.\n"); HCERTSTORE hCertStore;
if(hCertStore = CertOpenStore(
CERT_STORE_PROV_FILE,0,NULL,CERT_STORE_READONLY_FLAG,hFile))
ShowMessage("The certopenstore is successfully.\n");
else{
ShowMessage("The certopenstore is fails.\n");
return;
}
}
結果就是一直出現"The certopenstore is fails"
是我哪兒弄錯了嗎~!??
|
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
引言: 我的憑證是用MS提供的CERTSRV那個網頁所做出來的,在產生的過程中,為了把它用成是一個檔案,就選擇了~web瀏覽器憑證~其他選項~進階憑證要求~將金鑰標示成可匯出 ~將金鑰匯出到檔案 ~在產生憑證後可以下載憑證,並選擇了~DER 編碼~然後存成c:\face\abc.cer使用DER編碼?編碼只是編碼,憑證檔案是什麼format比較重要,不過一般憑證都是X.509或是P7,所以您應該改用: PCCERT_CONTEXT pCertContext = NULL; //Certificate context for Crypto API unsigned char *Cert; //Certificate's content read from Certificate's file unsigned long szCert; //length of certificate's content pCertContext = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,// The encoding type Cert, // The encoded data from the certificate retrieved szCert); // The length of the encoded data獲得PCCERT_CONTEXT之後一切好辦,當然上述程式只是介紹函式 使用方法,如何由檔案中讀取資料相信難不倒您。 PS:CertCreateCertificateContext()詳細資料請查閱MSDN,關 於此CASE的回應資料應該已經足夠,在下就回應到此。 ???
------
??? |
wooerder
一般會員 發表:2 回覆:7 積分:1 註冊:2003-09-03 發送簡訊給我 |
引言: 如何由檔案中讀取資料相信難不倒您。難倒我了 我用 HANDLE hFile=CreateFile("C:\\Face\\abc.cer",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); char buf[1024]; DWORD bytesread,nBytes=1024; bool bReadFile; bReadFile =ReadFile(hFile,buf,nBytes,&bytesread,NULL); PCCERT_CONTEXT pCertContext = NULL; unsigned char *Cert; unsigned long szCert; Cert=buf; szCert=1024; pCertContext = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,Cert,szCert); if (!pCertContext) ShowMessage("Can't get Certificate context!"); 為什麼就是得不到PCCERT_CONTEXT? 是我哪兒出了問題嗎?? |
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
To wooerder:
請檢查ReadFile()取讀出來的資料是否是1024bytes,
另外程式部分:
HANDLE hFile=CreateFile("C:\\Face\\abc.cer",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); char buf[1024]; DWORD bytesread,nBytes=1024; bool bReadFile; bReadFile =ReadFile(hFile,buf,nBytes,&bytesread,NULL); if(bytesread != nBytes){ ShowMessage("Can't read all data that you want to read..."); return; } PCCERT_CONTEXT pCertContext = NULL; pCertContext = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,buf,bytesread); if (!pCertContext) ShowMessage("Can't get Certificate context!"); else ShowMessage("Success.");如果都沒問題但還是失敗那就是憑證本身沒有符合 X.509或P7的format,建議去找M$那邊的測試憑證 試試看。 ???
------
??? |
dean
一般會員 發表:24 回覆:60 積分:21 註冊:2003-08-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |