韩剧1988免费观看全集_久久影视三级福利片_亚洲视频在线观看免费_在线观看欧美日韩_国产亚洲激情在线_亚洲精品美女久久久_欧美国产日韩一区二区在线观看_91在线观看免费高清完整版在线观看_日韩av免费看_国产又爽又黄的激情精品视频_琪琪亚洲精品午夜在线_欧美性猛xxx_不卡毛片在线看_国产亚洲日本欧美韩国_91国内在线视频_精品国产福利视频

當前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

運用Visual C++創(chuàng)建Crypto加/解密組件

運用Visual C++創(chuàng)建Crypto加/解密組件

更新時間:2022-10-11 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

作者: 討飯貓

  簡介
這篇文章將教你如何使用 Visual C++ 和 ATL 工具和 Microsoft CryptoAPI 建立一個能加/解密數(shù)據(jù)的組件。
Crypto 101
本文使用Microsoft® Cryptographic Application Programming Interface (CryptoAPI),將苦澀難懂的邏輯算法操作隱藏起來,如果想知道詳細信息請參看[url href=http://premium.microsoft.com/msdn/library/]MSDN Library[/url].如果想知道更多的密碼系統(tǒng),我推薦你看看這本書 [url href=http://www.aspzone.com/books/bookRedir.asp?url=http://www.amazon.com/exec/obidos/ASIN/0471117099/aspzonecom]Bruce Schneier's Applied Cryptography: Protocols, Algorithms, and Source Code in C[/url]

建立組件
首先,用"ATL COM AppWizard”建立一個新project。在這個例子中,我將其命名為”CryptoProj”。在 server type中選擇”Dynamic Link Library (DLL)”,點按”Finish”繼續(xù)。

定義界面
在 insert 菜單中點按"New ATL Object...",選擇 “Simple Object”,然后按 Next。

在 “Names” 欄中,設(shè) short name 為 “Crypto”,其他項照下面的填寫。

在 Attributes 欄,確定 Apartment Threading Model 被選上,Support IsupportErrorInfo 選項勾上,然后按 OK.

按右鍵點擊 Icrypto ,點”Add Method”加一個方法.

將該方法取名為”Encrypt”,在參數(shù)欄輸入"[in] BSTR bstrPlainText, [in] BSTR bstrPassword, [out, retval] VARIANT *vCipherText".

再加一個方法,取名為”Decrypt”,參數(shù)為"[in] VARIANT vCipherText, [in] BSTR bstrPassword, [out, retval] BSTR *bstrPlainText"

實現(xiàn)加密方法
需要包括 CryptoAPI 庫,在 Crypto.cpp 頭加一句: #include <wincrypt.h>


現(xiàn)在來定義我們需要的各種變量。 STDMETHODIMP CCrypto::Encrypt(BSTR bstrPlainText,
BSTR bstrPassword,
VARIANT *vCipherText)
{
BYTE *pbData;
BYTE *pbPassword;
SAFEARRAY* psa;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
DWORD dwCryptDataLen = 0;
DWORD dwDataLen = 0;
DWORD dwError = 0;
char buffer[200];

USES_CONVERSION;


由于許多CryptoAPI 調(diào)用要用注冊表,所以需要執(zhí)行一句RevertToSelf(). RevertToSelf();


下一步,我們需要將輸入變量轉(zhuǎn)化為我們能用的格式。 dwDataLen = SysStringLen(bstrPlainText);
pbData = (BYTE*)OLE2A(bstrPlainText);
pbPassword = (BYTE*)OLE2A(bstrPassword);


然后,用CryptAcquireContext function取得省缺 Crypto provider的句柄。 // Get handle to the default provider.
if (! CryptAcquireContext(&hProv,
"aspZoneCryptoComponent\0", MS_DEF_PROV,
PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
{
if (! CryptAcquireContext(&hProv,
"aspZoneCryptoComponent\0", MS_DEF_PROV,
PROV_RSA_FULL, (CRYPT_NEWKEYSET |
CRYPT_MACHINE_KEYSET)))
{
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptAcquireContext",
dwError);
return Error(buffer);
}
}


我們通過創(chuàng)建一個 one-way-hash密碼得到session key。 // Create a hash object.
if ( ! CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptCreateHash", dwError);
return Error(buffer);
}

// Hash in the password.
if ( ! CryptHashData(hHash, pbPassword, SysStringLen(bstrPassword), 0)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptHashData", dwError);
return Error(buffer);
}

// Derive a session key from the hash object.
if ( ! CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptDeriveKey", dwError);
return Error(buffer);
}

// Destroy hash object.
CryptDestroyHash(hHash);
hHash = 0;


現(xiàn)在來加密我們的數(shù)據(jù)。 // Encrypt the Data.
dwCryptDataLen = dwDataLen;
if ( ! CryptEncrypt(hKey, 0, true, 0, pbData, &dwCryptDataLen, dwDataLen)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptEncrypt", dwError);
return Error(buffer);
}


我們將加密后的數(shù)據(jù)放入一個數(shù)組中,而不是一個string里,因為它可能會包含null。雖然 BSTR 能處理null的情況,但不能保證用戶調(diào)用環(huán)境能正確處理,所以一個數(shù)組是最好的選擇。 // Place Encrypted Data into a VARIANT SAFEARRAY of VARIANT BYTE
SAFEARRAYBOUND rgsabound[] = {dwCryptDataLen, 0};
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
VARIANT* rgElems;
SafeArrayAccessData(psa, (LPVOID*)&rgElems);
for(DWORD i=0;i<dwCryptDataLen;i++){
VariantInit(&rgElems[i]);
rgElems[i].vt = VT_UI1;
rgElems[i].uiVal = pbData[i];
}
SafeArrayUnaccessData(psa);
VariantInit(vCipherText);
vCipherText->vt = (VT_ARRAY | VT_VARIANT) ;
vCipherText->parray = psa;


稍微整理一下,搞定。 // Destroy session key.
if(hKey) CryptDestroyKey(hKey);

// Release provider handle.
if(hProv) CryptReleaseContext(hProv, 0);

return S_OK;


實現(xiàn)解密方法
首先定義變量。 STDMETHODIMP CCrypto::Decrypt(VARIANT vCipherText,
BSTR bstrPassword,
BSTR *bstrPlainText)
{
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
SAFEARRAY* psa;
VARIANT HUGEP *pVar;
BYTE *pbData;
BYTE *pbPassword;
long lBound, uBound;
DWORD dwCryptDataLen = 0;
DWORD dwOffset = 0;
DWORD dwError = 0;
char buffer[200];

USES_CONVERSION;


同樣的原因,我們要調(diào)用RevertToSelf() RevertToSelf();


現(xiàn)在,當接收一個數(shù)組參數(shù)作為變量,該數(shù)組可能藏在結(jié)構(gòu)中的某個地方,所以需要一個判斷嵌套。 //Get the safe array out of the Variant.
if (vCipherText.vt == (VT_VARIANT | VT_BYREF))
{
if (vCipherText.pvarVal->vt == (VT_ARRAY | VT_VARIANT))
SafeArrayCopy(vCipherText.pvarVal->parray, &psa);
else
{
if (vCipherText.pvarVal->vt == (VT_ARRAY | VT_VARIANT | VT_BYREF))
SafeArrayCopy(*(vCipherText.pvarVal->pparray), &psa);
}
}
else
{
if (vCipherText.vt == (VT_ARRAY | VT_VARIANT | VT_BYREF))
SafeArrayCopy(*(vCipherText.pparray), &psa);
else
{
if (vCipherText.vt == (VT_ARRAY | VT_VARIANT))
SafeArrayCopy(vCipherText.parray, &psa);
else
return DISP_E_TYPEMISMATCH;
}
}


需要密文和密碼都是BYTE*類型。 //Convert the SAFEARRAY into a form we can use.
SafeArrayAccessData(psa, (void HUGEP* FAR*)&pVar);
SafeArrayGetLBound(psa, 1, &lBound);
SafeArrayGetUBound(psa, 1, &uBound);

dwOffset = 0 - lBound;
dwCryptDataLen = uBound + dwOffset + 1;

//Allocate memory
pbData = (BYTE *)malloc(dwCryptDataLen);

//Copy the array
for(DWORD i = lBound; i <= uBound; i++){ if( ! (pVar[i].vt & VT_UI1)){ //Data Elements must be VT_UI1 (Bytes). free(pbData); return DISP_E_TYPEMISMATCH; } pbData[i + dwOffset]="pVar[i].uiVal;" } //Get Password pbPassword="(BYTE*)OLE2A(bstrPassword);</PRE">


取得 Crypto Provider 的句柄。 // Get handle to the default provider.
if (! CryptAcquireContext(&hProv, "aspZoneCryptoComponent\0",
MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
{
if (! CryptAcquireContext(&hProv, "aspZoneCryptoComponent\0",
MS_DEF_PROV, PROV_RSA_FULL, (CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)))
{
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptAcquireContext", dwError);
return Error(buffer);
}
}


從 password 中得到 session key. // Create a hash object.
if ( ! CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptCreateHash", dwError);
return Error(buffer);
}

// Hash in the password.
if ( ! CryptHashData(hHash, pbPassword, SysStringLen(bstrPassword), 0)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptHashData", dwError);
return Error(buffer);
}

// Derive a session key from the hash object.
if ( ! CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptDeriveKey", dwError);
return Error(buffer);
}

// Destroy hash object.
CryptDestroyHash(hHash);
hHash = 0;


將密文解密到純文本中。 // Decrypt the Data.
if ( ! CryptDecrypt(hKey, 0, true, 0, pbData, &dwCryptDataLen)) {
dwError = GetLastError();
sprintf(buffer, "Error %x during CryptDecrypt", dwError);
return Error(buffer);
}

//Terminate the string with a null
pbData[dwCryptDataLen] = NULL;


設(shè)置返回值,大掃除,然后搞定。 //Place Decrypted data into retval
*bstrPlainText = SysAllocString(A2OLE((const char *)pbData));

// Destroy session key.
if(hKey) CryptDestroyKey(hKey);

// Release provider handle.
if(hProv) CryptReleaseContext(hProv, 0);

return S_OK;
}

原著:討飯貓
來自:chinaasp.com

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
亚洲情趣在线观看| 郴州新闻综合频道在线直播| 波多野结衣视频网址| 亚洲人成电影网站色www| 激情综合网五月| 国内外成人在线视频| 亚洲黄色片网站| 日本中文字幕不卡| 九九精品在线播放| 丰满的少妇愉情hd高清果冻传媒| 天天干天天干天天操| av天堂永久资源网| 无码av免费精品一区二区三区| 成人短视频在线观看| 92国产精品视频| 久久综合久久鬼色| 在线观看欧美理论a影院| 在线一区二区视频| 国产奶水涨喷在线播放| 欧美污在线观看| 人成免费电影一二三区在线观看| www操操操| 色琪琪久久se色| 国产精品视频自拍| 国产999精品久久久久久| 日本大片在线播放| 蜜臀久久99精品久久久| 亚洲一区亚洲| 久久久久久99| 不卡精品视频| 国产成人在线亚洲欧美| 久久精品高清| 欧美福利一区二区| 欧美va在线播放| www.五月天色| 蜜桃视频在线观看www社区| 亚洲国产一区二区视频| 欧美成人精品欧美一级| 91 中文字幕| 成人影院天天5g天天爽无毒影院| 亚洲免费在线视频观看| 国产在线视频一区二区| 久久影视中文粉嫩av| 国产精品欧美一区二区三区奶水| 欧美日韩中文另类| p色视频免费在线观看| 亚洲一区二区三区香蕉| 亚洲欧美综合| 欧美日韩亚洲国产成人| 在线一区二区三区四区| 精品亚洲一区二区三区四区五区高| 一区二区三区四区五区视频在线观看| 青椒成人免费视频| 亚洲天堂五月天| 久久97超碰国产精品超碰| 国产精品99在线观看| 精品国内自产拍在线观看视频| 亚洲福利精品在线| 成人午夜电影在线播放| 亚州精品国产精品乱码不99按摩| 日韩一区二区三区四区在线| 精品久久久无码中文字幕| 娇妻高潮浓精白浆xxⅹ| 久久久久免费精品| 成人白浆超碰人人人人| 久久久久久亚洲精品不卡| 在线免费一区三区| 日本在线观看中文字幕| 黄色网址在线免费播放| 九色porny丨首页入口在线| 成人免费a视频| 亚洲三区欧美一区国产二区| 99er精品视频| 一本久道久久综合狠狠爱亚洲精品| 成视频年人免费看黄网站| 少妇激情av一区二区三区| 国产日本欧美在线观看| 免费的黄色av| 夜夜嗨av一区二区三区免费区| 欧美娇小极度另类| 欧美日韩久久婷婷| 特级丰满少妇一级aaaa爱毛片| 亚洲精品久久一区二区三区777| 丰满大乳少妇在线观看网站| 91福利国产在线观看菠萝蜜| 婷婷激情小说网| 久久久久久国产三级电影| 91成人精品观看| 日韩视频1区| 国产欧美一区二区在线观看| 中文亚洲字幕| 欧美性受xxxx黑人| 国产精品主播直播| 91在线码无精品| 99中文字幕在线观看| 久久成人18免费网站| 在线精品视频播放| 国产白浆在线免费观看| 欧美一区二区视频在线| 99热国产免费| 538国产精品视频一区二区| 久久五月天小说| 欧美做受高潮1| 日本在线啊啊| 三级在线观看网站| 2020国产在线视频| 一区2区3区在线看| 亚洲av无码一区二区三区dv| 日本黄色免费片| 亚洲乱码国产乱码精品精可以看| 亚洲国语精品自产拍在线观看| 亚洲免费二区| 天堂а√在线资源在线| 欧美r级电影| 午夜亚洲国产au精品一区二区| 日本黄色大片在线观看| 久久99精品国产自在现线小黄鸭| 久久中文亚洲字幕| 日本伦理一区二区三区| 婷婷5月激情5月| 一二三四在线观看视频| 给我看免费高清在线观看| 蜜臀久久精品久久久久| 热久久久久久久| 日韩三级精品| 亚州视频一区二区三区| 中文字幕亚洲欧美一区二区三区| 日韩最新av在线| 国产精品入口麻豆原神| 在线www天堂网在线| 婷婷综合另类小说色区| 精品伦一区二区三区| 欧美精品在线一区| 国产大片一区二区三区| 一区二区三区在线免费观看视频| 国产黄a三级三级三级av在线看| 亚洲国产成人精品女人| 濑亚美莉一二区在线视频| 狠狠干狠狠搞| 涩涩网站在线看| 免费电影日韩网站| 亚洲日本一区二区三区在线不卡| 欧美—级a级欧美特级ar全黄| www.涩涩涩| 北岛玲精品视频在线观看| 一区二区日韩av| 国产三级精品在线| 在线播放免费| 国产精品蜜芽在线观看| 性网站在线看| 少妇被狂c下部羞羞漫画| 日本午夜免费一区二区| 午夜av在线免费观看| 国产精品久久久久久亚洲调教| 国产精品99久久久久久久女警| 能在线观看的av| 国产精品日日摸夜夜摸av| 亚洲人成精品久久久| 免费看成年人视频在线观看| 豆国产96在线|亚洲| 免费在线观看的黄色网址| 高清av一区二区三区| 亚洲成年人电影| 国产美女自拍视频| 欧美一级淫片播放口| 日韩av中文字幕一区二区三区| 奇米四色中文综合久久| 四虎亚洲精品| 亚洲一二三四区| 日韩美女在线看| 五月天婷婷激情网| 福利一区二区三区视频在线观看| 天天摸天天干| 国产精品免费精品一区| 中文字幕精品影院| 亚洲国产一二三区| 欧美不卡高清一区二区三区| 男人添女人下部高潮视频在线观看| 麻豆传媒网站在线观看| 黄色资源在线看| 亚洲天堂黄色片| 全免费一级毛片免费看| 色噜噜偷拍精品综合在线| 国产精品一区二区在线观看网站| 午夜精品久久久久久久蜜桃app| 欧美另类z0zx974| 免费成人深夜夜行网站| 欧洲vodafonewi精品| 国产激情视频在线播放| 邻家有女韩剧在线观看国语| 在线观看欧美理论a影院| 激情深爱综合网| 亚洲区免费视频| 国产偷亚洲偷欧美偷精品| 男人添女人下部视频免费| yellow91字幕网在线| 欧美一区二区激情| 免费视频久久| 受虐m奴xxx在线观看| 一区二区三区中文在线观看| 精品人妻一区二区免费| 欧美日韩高清在线一区| 欧美色图激情小说| 国偷自产av一区二区三区麻豆| 亚洲激情五月婷婷| 国产精品中文字幕在线观看| 欧美高清激情brazzers| 成年人羞羞的网站| 日本a级片免费| 亚洲精品乱码久久久久久蜜桃图片| 99久久亚洲国产日韩美女| 成人h在线观看| 91嫩草在线视频| 2019中文字幕视频| 久久99精品久久久久久野外| 精品精品国产国产自在线| 92看片淫黄大片看国产片| 在线视频中文字幕一区二区| 亚洲综合欧美日韩| 一区二区三区动漫| 精品久久久一区二区| 91麻豆精品91久久久久同性| 中文字幕网址在线| 从欧美一区二区三区| 亚洲视频在线观看一区| 日韩一卡二卡在线观看| 91最新在线免费观看| kk眼镜猥琐国模调教系列一区二区| 麻豆最新免费在线视频| 国产亚洲一区二区精品| 国产在线观看不卡| 中文在线一区| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲精品黄色| 久久久精品午夜少妇| xfplay资源站夜色先锋| 国产在线中文字幕| 一本大道久久加勒比香蕉| 亚洲视频视频在线| 国产不卡av在线播放| 成人妖精视频yjsp地址| 男人添女荫道口图片| 91精品影视| 国产一卡二卡在线播放| 国产乱论精品| 欧美欧美天天天天操| 不卡视频一二三四| 欧美日韩国产在线播放网站| 在线亚洲午夜片av大片| 日韩av在线一区二区三区| 新的色悠悠久久久| 日韩欧美三级| 男人和女人做事情在线视频网站免费观看| 中文字幕日韩综合| 我要色综合中文字幕| 日韩系列欧美系列| 日韩欧美在线免费观看视频| 国产无精乱码一区二区三区| 蜜桃视频在线观看网站| 一区二区三区四区视频| y111111国产精品久久婷婷| 91佛爷在线| 久久久人成影片一区二区三区| 天堂av电影在线观看| 久久精品国产亚洲AV无码男同| 蜜桃在线一区二区三区| 正在播放一区| 视频区 图片区 小说区| 国产乱淫av麻豆国产免费| 亚洲成人精品久久久| 国产精品乱码久久久| 精品久久久久久一区| 欧美成人一二区| av鲁丝一区鲁丝二区鲁丝三区| 久久深夜福利| jizz在线免费观看| 日韩av网站免费在线| 亚洲欧洲精品天堂一级| 精品国产一区二区三区不卡蜜臂| 一区二区国产在线观看| 操她视频在线观看| 猫咪av网站| 欧美艳星介绍134位艳星| 国产成人免费在线观看| 免费在线观看日韩视频| 秋霞av一区二区三区| 欧美日韩精品国产| 91精品999| 国产不卡精品视男人的天堂| 加勒比精品视频| 亚洲影音一区| 岛国视频免费在线观看| 国产三区在线成人av| 国产最新视频在线观看| 九九九九精品九九九九| 亚洲最大成人综合网| 欧美黄色免费视频| 成人网站免费观看入口| 三级av免费看| 高清av免费一区中文字幕| 国产一级片播放| 男人精品网站一区二区三区| 伊人国产在线看一| 欧美性生活一级片| 免费看一级视频| 亚洲男人在线天堂| 销魂美女一区二区三区视频在线| 东方aⅴ免费观看久久av| 毛片毛片毛片毛片毛| 久久要要av| 91豆花视频在线播放| 一个人看的www片免费高清视频| aaaaa一级片| 国产a国产a国产a| 久久久久99精品成人片试看| 蜜臀久久99精品久久久酒店新书| 国产精品麻豆入口| 黄色在线网站| 亚洲欧洲一区二区在线观看| 国产免费亚洲高清| 国产专区自拍| 久久影视中文字幕| 青青视频在线观| 免费观看91视频大全| 日韩精品一区二区三区在线| 年轻的保姆91精品| 欧美激情在线免费观看| 欧美孕妇与黑人巨交|