锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓錛氬噯澶囧伐浣?br />涓鑸繀欏誨寘鍚涓嬪ご
鏂囦歡
浠ュ強(qiáng)瀹氫箟
#include
#include
#include
#define MY_ENCODING_TYPE聽(tīng) (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
聽(tīng)褰撳寘鍚玾incrypt.h澶?/font>
鏂囦歡
鏃訛紝涓鑸兘闇瑕佸畾涔?define _WIN32_WINNT 0x錛堝叿浣撶殑鍊鹼級(jí)錛屽惁鍒欏皢寰楀埌濡備笅閿欒錛歟rror C2065: undeclared identifier錛屼笉鍚岀殑鎿嶄綔
緋葷粺
涓嶅悓瀹氫箟濡備笅錛?br />Windows Server 2003 family _WIN32_WINNT>=0x0502
WINVER>=0x0502
Windows XP _WIN32_WINNT>=0x0501
WINVER>=0x0501
Windows 2000 _WIN32_WINNT>=0x0500
WINVER>=0x0500
Windows NT 4.0 _WIN32_WINNT>=0x0400
WINVER>=0x0400
Windows Me _WIN32_WINDOWS=0x0500
WINVER>=0x0500
Windows 98 _WIN32_WINDOWS>=0x0410
WINVER>=0x0410
Windows 95 _WIN32_WINDOWS>=0x0400
WINVER>=0x0400
Internet Explorer 6.0 _WIN32_IE>=0x0600
Internet Explorer 5.6 _WIN32_IE>=0x0560
Internet Explorer 5.01, 5.5 _WIN32_IE>=0x0501
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE>=0x0500
Internet Explorer 4.01 _WIN32_IE>=0x0401
Internet Explorer 4.0 _WIN32_IE>=0x0400
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE>=0x0300
浜岋細(xì)浜?jiǎn)瑙e熀鏈煡璇?br />CryptoAPI鐨勯厤緗俊鎭瓨鍌ㄥ湪娉ㄥ唽琛ㄤ腑錛屽寘鎷涓嬪瘑閽ワ細(xì)
HKEY錛縇OCAL錛縈ACHINE錛糞OFTWARE錛糓icrosoft \ Cryptography \Defaults
HKEY_CURRENT_USER\ Software \ Microsoft\ Cryptography \Providers
---- CryptoAPI浣跨敤涓ょ瀵嗛挜錛氫細(xì)璇濆瘑閽ヤ笌鍏叡/縐佷漢瀵嗛挜瀵廣備細(xì)璇濆瘑閽ヤ嬌鐢ㄧ浉鍚岀殑鍔犲瘑鍜岃В瀵嗗瘑閽ワ紝榪欑綆楁硶杈冨揩錛屼絾蹇呴』淇濊瘉瀵嗛挜鐨勫畨鍏ㄤ紶閫掋傚叕鍏?縐佷漢瀵嗛挜瀵逛嬌鐢ㄤ竴涓叕鍏卞瘑閽ュ拰涓涓浜哄瘑閽ワ紝縐佷漢瀵嗛挜鍙湁涓撲漢鎵嶈兘浣跨敤錛屽叕鍏卞瘑閽ュ彲浠ュ箍娉涗紶鎾傚鏋滃瘑閽ュ涓殑涓涓敤浜庡姞瀵嗭紝鍙︿竴涓竴瀹氱敤浜庤В瀵嗐傚叕鍏?縐佷漢瀵嗛挜瀵圭畻娉曞緢鎱紝涓鑸彧鐢ㄤ簬鍔犲瘑灝忔壒鏁版嵁錛屼緥濡傜敤浜庡姞瀵嗕細(xì)璇濆瘑閽ャ侰ryptoAPI鏀寔涓ょ鍩烘湰鐨勭紪鐮佹柟娉曪細(xì)嫻佸紡緙栫爜鍜屽潡緙栫爜銆傛祦寮忕紪鐮佸湪鏄庣爜鏂囨湰鐨勬瘡涓浣嶄笂鍒涘緩緙栫爜浣嶏紝閫熷害杈冨揩錛屼絾瀹夊叏鎬ц緝浣庛傚潡緙栫爜鍦ㄤ竴涓畬鏁寸殑鍧椾笂錛堜竴鑸負(fù)64浣嶏級(jí)涓婂伐浣滐紝闇瑕佷嬌鐢ㄥ~鍏呯殑鏂規(guī)硶瀵硅緙栫爜鐨勬暟鎹繘琛岃垗鍏ワ紝浠ョ粍鎴愬涓畬鏁寸殑鍧椼傝繖縐嶇畻娉曢熷害杈冩參錛屼絾鏇村畨鍏ㄣ?
涓夛細(xì)涓嬮潰榪涘叆鍏蜂綋鐨勭紪紼嬄?
涓錛?Creating a Key Container and Generating Keys
聽(tīng) 鍒涘緩涓涓瘑閽ュ鍣紝鍦ㄨ繘琛屽姞瀵嗭紝瑙e瘑
鏂囦歡
錛屽茍涓旂鍚嶇殑鏃跺欙紝蹇呴』闇瑕佷竴涓叕/縐侀挜瀵癸紝涓嬮潰鎴戜滑灝辨潵鍒涘緩榛樿鐨勫瘑閽ュ鍣紝瑕佹敞鎰忕殑鏄垱寤哄瘑閽ュ鍣ㄥ茍涓嶄細(xì)鑷姩浜х敓鍏?縐侀挜瀵?
聽(tīng) 涓嬮潰鏄垜浠?/font>
紼嬪簭
鐨勪換鍔★細(xì)
聽(tīng) 1錛屽亣濡傚瘑閽ュ鍣ㄤ笉瀛樺湪鍒欏垱寤轟竴涓?br />聽(tīng) 2錛屽亣濡傜鍚嶅瘑閽ヤ笉瀛樺湪鍒欏湪瀵嗛挜瀹瑰櫒閲屽垱寤轟竴涓?br />聽(tīng) 3錛屽亣濡備氦鎹㈠瘑閽ヤ笉瀛樺湪鍒欏湪瀵嗛挜瀹瑰櫒閲屽垱寤轟竴涓?br />聽(tīng) 4錛岃幏鍙朇SP涓殑涓浜涘弬鏁?br />聽(tīng) 涓嬮潰鏄叿浣撶殑姝ラ錛?br />聽(tīng) 1錛岃繛鎺ョ己鐪佺殑CSP
BOOL WINAPI CryptAcquireContext(
聽(tīng) HCRYPTPROV* phProv,聽(tīng)聽(tīng) //out
聽(tīng) LPCTSTR pszContainer, //in
聽(tīng) LPCTSTR pszProvider,聽(tīng) //in
聽(tīng) DWORD dwProvType,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in
聽(tīng) DWORD dwFlags聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in
);
絎竴涓弬鏁版槸榪斿洖鐨凜SP鍙ユ焺錛岀浜屼釜鏄瘑閽ュ鍣ㄧ殑鍚嶅瓧錛岀涓変釜鏄疉 null-terminated string that specifies the name of the CSP to be used.絎洓涓槸鎸囧畾鎻愪緵鐨勭被鍨嬨備緥濡傦細(xì)CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))錛?br />濡傛灉褰撳墠鏈哄櫒鐨勬湭鏇捐緗繃緙虹渷鐨勫瘑閽ュ鍣紝鍥犳蹇呴』涓烘満鍣ㄥ垱寤虹己鐪佺殑瀵嗛挜瀹瑰櫒銆?
CryptAcquireContext( &hCryptProv, UserName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)澶у鏈夋病鏈夌湅鍒幫紝鍙槸鏈鍚庝竴涓弬鏁頒笉鍚岃屽凡錛屽浜?jiǎn)涓涓狢RYPT_NEWKEYSET鑰屽凡銆?br />聽(tīng) 2錛屽彇寰桟SP鐨勫弬鏁?br />BOOL WINAPI CryptGetProvParam(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) DWORD dwParam,
聽(tīng) BYTE* pbData,
聽(tīng) DWORD* pdwDataLen,
聽(tīng) DWORD dwFlags
);
絎竴涓弬鏁版槸CSP鐨勫彞鏌勶紝絎簩涓弬鏁版槸闇瑕佸彇寰楃殑鍏蜂綋鍙傛暟瀵硅薄錛堢被鍨嬫瘮杈冨錛屽叿浣撹鐪婱SDN錛夈?br />渚嬪瓙錛欳ryptGetProvParam(hCryptProv, PP_CONTAINER, (BYTE *)szUserName, &dwUserNameLen, 0)
聽(tīng) 3錛屽嚱鏁拌繑鍥炴墍鑾峰彇瀵嗛挜綾誨瀷鐨勫彞鏌勶紙0琛ㄥけ璐ワ紝闈?琛ㄦ垚鍔燂級(jí)
BOOL WINAPI CryptGetUserKey(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) DWORD dwKeySpec,
聽(tīng) HCRYPTKEY* phUserKey
);
聽(tīng) 鍙傛暟姣旇緝綆鍗曪紝鍙皥璋堢浜屾鍙傛暟錛屽畠鍙互鏄疉T_KEYEXCHANGE錛堜氦鎹㈠瘑閽ワ級(jí) or AT_SIGNATURE錛堢鍚嶅瘑閽ワ級(jí)錛屼緥濡傦細(xì)
CryptGetUserKey(hCryptProv,AT_KEYEXCHANGE,&hKey)
聽(tīng) 4錛屼駭鐢熶竴涓殢鏈虹殑浜ゆ崲瀵嗛挜鎴栬呭叕/縐侀挜瀵?br />BOOL WINAPI CryptGenKey(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) ALG_ID Algid,
聽(tīng) DWORD dwFlags,
聽(tīng) HCRYPTKEY* phKey
)錛?br />ALG_ID 琛ㄦ槑浜х敓縐侀挜鎵浣跨敤鐨勭畻娉曘傛湁濡備笅鍙傛暟錛?br />
寰蔣
鎻愪緵鐨勫熀鏈畻娉?br />CALG_MD2錛孋ALG_MD5錛孋ALG_SHA錛孋ALG_SHA1錛孋ALG_MAC錛孋ALG_HMAC錛孋ALG_SSL3_SHAMD5錛孋ALG_MD2錛孋ALG_MD2
CALG_RSA_SIGN錛孋ALG_RSA_KEYX錛孋ALG_RC2錛孋ALG_RC4錛孋ALG_DES
寰蔣
鎻愪緵鐨勫寮哄瀷綆楁硶錛?br />CALG_MD2錛孋ALG_MD5錛孋ALG_SHA錛孋ALG_SHA1
CALG_MAC錛孋ALG_HMAC 錛孋ALG_SSL3_SHAMD5錛孋ALG_RSA_SIGN錛孋ALG_RSA_KEYX錛孋ALG_RC2錛孋ALG_RC4錛孋ALG_DES錛孋ALG_3DES_112錛孋ALG_3DES
浣跨敤DH鐨凜SP鏈夊涓嬩袱涓弬鏁幫紝CALG_DH_EPHEM錛孋ALG_DH_SF
浣跨敤鍏紑瀵嗛挜綆楁硶錛欰T_KEYEXCHANGE錛孉T_SIGNATURE
dwFlags,錛岃〃紺哄瘑閽ヤ嬌鐢ㄧ殑闀垮害錛屽弬鏁板彲浠ヤ負(fù)0錛岄噰鐢ㄩ粯璁ょ殑瀵嗛挜闀垮害銆傛垨鑰呮槸榪涜濡備笅鍑犱釜鍙傛暟鐨勬垨錛?br />CRYPT_ARCHIVABLE錛氳〃紺哄湪鍙ユ焺鍦ㄥ叧闂箣鍓嶉兘鑳藉琚鍑?br />CRYPT_CREATE_SALT錛氳〃紺哄瘑閽ユ寜鐓т竴涓猻alt value鏉ラ殢鏈轟駭鐢熴?br />CRYPT_EXPORTABLE錛氳〃紺哄瘑閽ュ彲浠ヤ粠CSP涓鍑哄埌BLOB錛屽洜涓轟細(xì)璇濆瘑閽ヤ駭鐢熸槸蹇呴』鍙鍑虹殑錛屾墍浠ュ繀欏昏緗?br />CRYPT_NO_SALT錛氳〃紺烘病鏈塖ALT VALUE鑾峰彇allocated for a forty-bit symmetric key
CRYPT_PREGEN錛氳〃紺哄湪DH鎴栬匘SS瀵嗛挜浜х敓蹇呴』鏈変釜鍒濆鍖栥?br />渚嬪錛欳ryptGenKey(hCryptProv,AT_KEYEXCHANGE,0,&hKey)
聽(tīng) 5錛岄噴鏀綜SP鍙ユ焺
BOOL WINAPI CryptReleaseContext(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) DWORD dwFlags //淇濈暀瀛楋紝鐜板湪蹇呴』涓?
);
聽(tīng) 6錛屼負(fù)CSP澧炲姞涓涓猺eference count錛堢敤鏉ヨ窡韙狢OM瀵硅薄鐨勬暣鏁板鹼紝褰撳璞″垱寤猴紝鍊間負(fù)1銆傛瘡嬈″瀵硅薄鐨勬搷浣滈兘灝嗗鍔狅紝鑰屽瀵硅薄鐨勫叧闂皢鍑忓皯錛屽綋鍊間負(fù)0鏄紝瀵硅薄閲婃斁錛屾墍浠ヤ笌瀵硅薄鐩稿叧鎿嶄綔灝嗘棤鏁堬級(jí)
BOOL WINAPI CryptContextAddRef(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) DWORD* pdwReserved,聽(tīng) //淇濈暀瀛楋紝蹇呴』涓篘ULL
聽(tīng) DWORD dwFlags聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //淇濈暀瀛楋紝蹇呴』涓?
);
聽(tīng) 浜岋細(xì)Deriving a Session Key from a Password
聽(tīng) 1錛岃繛鎺SP
聽(tīng) 2錛屼嬌鐢–ryptCreateHash浜х敓涓涓┖鐨凥ASH瀵硅薄
聽(tīng) 3錛屽瀵嗙爜榪涜HASH澶勭悊
聽(tīng) 4錛岄噴鏀綡ASH浠ュ強(qiáng)瀵嗙爜瀵硅薄
聽(tīng) 5錛岄噴鏀綜SP
聽(tīng) 涓嬮潰鏄叿浣撶殑姝ラ錛?br />聽(tīng) 1錛孋ryptCreateHash鍒濆鍖栦竴涓狧ASH瀵硅薄
BOOL WINAPI CryptCreateHash(
聽(tīng) HCRYPTPROV hProv,聽(tīng) //in
聽(tīng) ALG_ID Algid,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in
聽(tīng) HCRYPTKEY hKey,聽(tīng)聽(tīng)聽(tīng) //in
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in淇濈暀瀛楋紝蹇呴』涓?
聽(tīng) HCRYPTHASH* phHash //out
);
絎簩涓弬鏁版槸鎸囧畾HASH綆楁硶錛屾湁CALG_HMAC,CALG_MAC,CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1,CALG_SSL3_SHAMD5銆傜涓変釜鍙傛暟瀵逛簬閭d簺keyed hash錛屼緥濡侶MAC錛孧AC綆楁硶銆備絾鏄痭onkeyed綆楁硶錛屽繀欏昏緗負(fù)0銆?br />聽(tīng) 2錛孋ryptHashData瀵規(guī)暟鎹嬌鐢℉ASH
BOOL WINAPI CryptHashData(
聽(tīng) HCRYPTHASH hHash,聽(tīng) //in,HASH瀵硅薄鍙ユ焺
聽(tīng) BYTE* pbData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,寰匟ASH鐨勬暟鎹?br />聽(tīng) DWORD dwDataLen,聽(tīng)聽(tīng) //in,寰匟ASH鏁版嵁鐨勯暱搴︼紝褰揹wFlags涓篊RYPT_USERDATA涓?鏃訛紝蹇呴』涓?
聽(tīng) DWORD dwFlags聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,涓鑸負(fù)0錛屾垨鑰呬負(fù)CRYPT_USERDATA錛堢敤鍦ㄧ敤鎴瘋繘鍏?/font>
緋葷粺
鏃墮渶瑕佽緭鍏IN錛?br />);
聽(tīng) 3錛孋ryptDeriveKey浠庢煇涓鏁版嵁浜х敓浼?xì)璇濆瘑閽ュQ屼粬鏈夌偣綾諱技CryptGenKey錛屼絾鏄粬浜х敓鐨勪細(xì)璇濆瘑閽ユ潵鑷浐瀹氭暟鎹紝鑰孋ryptGenKey鏄殢鏈轟駭鐢熺殑銆傚茍涓斾笉鑳戒駭鐢熷叕/縐侀挜瀵?br />BOOL WINAPI CryptDeriveKey(
聽(tīng) HCRYPTPROV hProv,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,CSP鍙ユ焺
聽(tīng) ALG_ID Algid,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,鎸囧畾鐨勭畻娉曪紝綾諱技CryptGenKey
聽(tīng) HCRYPTHASH hBaseData,聽(tīng) //in,HASH瀵硅薄鐨勫彞鏌?br />聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,鎸囧畾浜х敓瀵嗛挜鐨勭被鍨?br />聽(tīng) HCRYPTKEY* phKey聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,out浜х敓鐨勫瘑閽ュ彞鏌勫湴鍧
);
渚嬪錛欳ryptDeriveKey(hCryptProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey)
聽(tīng) 4錛孋ryptDestroyHash(hHash);
聽(tīng) 5, CryptDestroyKey(hKey);
聽(tīng) 6, 鍦ㄨ繖閲屽彂鐜頒竴涓笉閿欑殑鍑芥暟錛屽氨鏄偅縐嶆彁紺鴻緭鍏ュ瘑鐮佺殑鍛戒護(hù)琛岋紙灞忓箷鍙細(xì)鍑虹幇***錛?br />聽(tīng) void GetConsoleInput(char* strInput, int intMaxChars)
{
聽(tīng)char ch;
聽(tīng)char minChar = ' ';
聽(tīng)minChar++;
聽(tīng)ch = getch();
聽(tīng)while (ch != '\r')
聽(tīng){
聽(tīng) if (ch == '\b' && strlen(strInput) > 0)
聽(tīng) {
聽(tīng)聽(tīng) strInput[strlen(strInput)-1]聽(tīng)聽(tīng) = '\0';
聽(tīng)聽(tīng) printf("\b \b");
聽(tīng) }
聽(tīng) else if (ch >= minChar && strlen(strInput) < intMaxChars)
聽(tīng) {
聽(tīng)聽(tīng) strInput[strlen(strInput)+1] = '\0';
聽(tīng)聽(tīng) strInput[strlen(strInput)]聽(tīng)聽(tīng) = ch;
聽(tīng)聽(tīng) putch('*');
聽(tīng) }
聽(tīng) ch = getch();
聽(tīng)}
聽(tīng)putch('\n');
}
聽(tīng) 涓夛細(xì)Duplicating,setting and getting Session key
聽(tīng) 1,榪炴帴CSP
聽(tīng) 2,浣跨敤CryptGenKey浜х敓涓涓細(xì)璇濆瘑閽?br />聽(tīng) 3,CryptDuplicateKey澶嶅埗浼?xì)璇濆瘑閽?br />聽(tīng) 4,CryptSetKeyParam鏀瑰彉瀵嗛挜浜х敓鐨勮繃紼?br />聽(tīng) 5,CryptGenRandom浜х敓闅忔満鏁?br />鍏蜂綋榪囩▼銆?br />1錛孋ryptDuplicateKe澶嶅埗浼?xì)璇濆瘑閽?br />BOOL WINAPI CryptDuplicateKey(
聽(tīng) HCRYPTKEY hKey,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in 浼?xì)璇濆瘑閽ュ彞鏌?br />聽(tīng) DWORD* pdwReserved,聽(tīng) //in 淇濈暀瀛楋紝蹇呴』涓篘ULL
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in 淇濈暀瀛楋紝蹇呴』涓?
聽(tīng) HCRYPTKEY* phKey聽(tīng)聽(tīng)聽(tīng)聽(tīng) //out 鏂扮殑浼?xì)璇濆瘑閽?br />);
2,CryptSetKeyParam瀹氬埗浼?xì)璇濆瘑閽ョ殑鍙傛?br />BOOL WINAPI CryptSetKeyParam(
聽(tīng) HCRYPTKEY hKey,
聽(tīng) DWORD dwParam,聽(tīng) //in 寰堝錛屽叿浣撹鐪婱SDN
聽(tīng) BYTE* pbData,
聽(tīng) DWORD dwFlags聽(tīng) //in聽(tīng) 鍙湁鍦╠wParam=KP_ALGID鎵嶈浣跨敤
);
渚嬪CryptSetKeyParam(hOriginalKey, KP_MODE, (BYTE*)&dwMode, 0)(dwMode = CRYPT_MODE_ECB)
3,CryptGenRandom涓虹┖闂翠駭鐢熼殢鏈哄瓧鑺?br />BOOL WINAPI CryptGenRandom(
聽(tīng) HCRYPTPROV hProv,
聽(tīng) DWORD dwLen,聽(tīng)聽(tīng)聽(tīng) //闇瑕佷駭鐢熺殑闅忔満姣旂壒鏁?br />聽(tīng) BYTE* pbBuffer聽(tīng) //闇瑕佽繑鍥炴暟鎹殑絀洪棿錛岃繖涓猵bBuffer鍙互絳変簬CryptSetKeyParam鐨刾bData
);
渚嬪錛欳ryptGenRandom(hCryptProv, 8, pbData)
4,CryptGetKeyParam鑾峰彇瀵嗛挜鐨勪竴浜涘弬鏁?br />BOOL WINAPI CryptGetKeyParam(
聽(tīng) HCRYPTKEY hKey,
聽(tīng) DWORD dwParam,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,鍙傛暟浼楀
聽(tīng) BYTE* pbData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //out錛岃幏鍙朆YTE鏁版嵁鐨勬寚閽?br />聽(tīng) DWORD* pdwDataLen, //out錛岃幏鍙朆YTE鏁版嵁鐨勯暱搴?br />聽(tīng) DWORD dwFlags聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //鍏抽敭瀛楋紝蹇呴』涓?
);
渚嬪錛欳ryptGetKeyParam(hKey, KP_IV, pbData, &dwCount, 0)
聽(tīng) 鍥涳細(xì)Exporting a Session Key
聽(tīng) 1,榪炴帴CSP
聽(tīng) 2,CryptGetUserKey鑾峰彇鍏?縐侀挜瀵瑰拰浜ゆ崲瀵嗛挜錛屽叕縐侀挜鐢ㄦ潵絳懼悕錛岃屼氦鎹㈠瘑閽ョ敤鏉ュ鍑轟細(xì)璇濆瘑閽?br />聽(tīng) 3,CryptGenKey浜х敓浼?xì)璇濆瘑閽?br />聽(tīng) 4,CryptExportKey鍒涘緩綆鍗曞寘鍚湁浼?xì)璇濆瘑閽ョ殑key BLOB
聽(tīng) 5,閲婃斁澶勭悊錛?br />聽(tīng) 鍏蜂綋榪囩▼錛?br />1,CryptExportKey鍑芥暟瀵煎嚭瀵嗛挜
BOOL WINAPI CryptExportKey(
聽(tīng) HCRYPTKEY hKey,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //闇瑕佸鍑虹殑瀵嗛挜鍙ユ焺
聽(tīng) HCRYPTKEY hExpKey,聽(tīng) //灝嗗緟瀵煎嚭瀵嗛挜鐢ㄤ氦鎹㈠瘑閽ヨ繘琛屽姞瀵嗭紝鍋囧鏄叕寮鐨凚LOG褰撶劧灝辮緗負(fù)0
聽(tīng) DWORD dwBlobType,聽(tīng)聽(tīng) //鎸囧畾瀵煎嚭鐨勫瘑閽LOB綾誨瀷銆傚叚涓弬鏁拌MSDN
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //CRYPT_DESTROYKEY錛孋RYPT_SSL2_FALLBACK錛孋RYPT_OAEP
聽(tīng) BYTE* pbData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //瀵煎嚭鐨勬暟鎹寚閽堬紝浠ュ悗灝卞彲浠ュ皢榪欎釜鏁版嵁鍐欏紓佺洏鎴栬呭埆鐨勪換鍔°?br />聽(tīng) DWORD* pdwDataLen聽(tīng)聽(tīng) //瀵煎嚭鐨勬暟鎹暱搴?br />);
渚嬪錛欳ryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen)
2錛孋ryptImportKey灝嗗瘑閽ヤ粠BLOB杞崲鍒癈SP涓?br />BOOL WINAPI CryptImportKey(
聽(tīng) HCRYPTPROV hProv,聽(tīng) //CSP鍙ユ焺
聽(tīng) BYTE* pbData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //寰呰漿鎹㈢殑BLOB鏁版嵁
聽(tīng) DWORD dwDataLen,聽(tīng)聽(tīng) //寰呰漿鎹㈢殑鏁版嵁闀垮害
聽(tīng) HCRYPTKEY hPubKey, //瀵笲LOB瑙e瘑鐨勫叕閽ワ紝璀涓婇潰鏄敤浜ゆ崲瀵嗛挜瀵嗛挜鍔犲瘑鐨勶紝灝辯敤浜ゆ崲瀵嗛挜瑙e瘑
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //鐩墠榪樺彧搴旂敤鍦ㄥ綋涓瀵瑰叕/縐侀挜浠嶱RIVATEKEYBLOB涓姞鍏SP涓繖縐嶆儏鍐點(diǎn)?br />聽(tīng) HCRYPTKEY* phKey聽(tīng)聽(tīng) //out瀵煎叆鐨勫瘑閽?br />);
渚嬪錛欳ryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey)
聽(tīng) 浜旓細(xì)Encoding and Decoding Messages
聽(tīng) 緙栫爜鐨勫鐞嗚繃紼?br />聽(tīng) 1錛屽皢寰呯紪鐮佺殑鏁版嵁杞寲涓哄悎閫傜殑鏍煎紡錛屼嬌鐢?br />聽(tīng) 2錛岃皟鐢–ryptMsgOpenToEncode錛宲assing the necessary argument;
聽(tīng) 3, 璋冪敤CryptMsgUpdate鍑芥暟澶氭錛屾渶鍚庝竴嬈¤皟鐢ㄦ椂錛屽皢final鍙傛暟璁劇疆涓簍rue
聽(tīng) 4, 璋冪敤CryptMsgGetParam鏉ヨ幏鍙栦竴涓渶瑕佸緱鍒扮殑鍙傛暟銆?br />聽(tīng) 5, 璋冪敤CryptMsgClose鏉ュ叧闂秷鎭?br />聽(tīng) 瑙g爜鐨勫鐞嗚繃紼?br />聽(tīng) 1錛屾鏌ョ敵璇風(fēng)殑鏀劇紪鐮佸悗鏁版嵁鐨勭┖闂達(dá)紝鍒╃敤鍑芥暟CryptMsgCalculateEncodedLength.
聽(tīng) 2錛岃皟鐢ㄥ嚱鏁癈ryptMsgOpenToDecode,passing the necessary argument錛?br />聽(tīng) 3錛岃皟鐢–ryptMsgUpdate涓嬈★紝榪欏皢瀵艱嚧鍚堥傜殑鍔ㄤ綔鍘誨鐞嗕俊鎭紝浠ユ潵浜庝俊鎭殑鏍煎紡
聽(tīng) 4錛屼竴浜涢澶栫殑澶勭悊錛屼緥濡傞澶栫殑瑙e瘑鎴栬呮槸楠岃瘉錛岃皟鐢–ryptMsgControl,
聽(tīng) 5錛岃皟鐢–ryptMsgGetParam鏉ヨ幏鍙栭渶瑕佸緱鍒扮殑鍙傛暟
聽(tīng) 6錛岃皟鐢–ryptMsgClose鏉ュ叧闂秷鎭?br />聽(tīng) 鍏蜂綋鐨勫嚱鏁頒粙緇嶏細(xì)
聽(tīng) 1錛孋ryptMsgCalculateEncodedLength璁$畻鎵闇瑕佺殑瀛樺偍緙栫爜鐨勬渶澶х┖闂村?br />DWORD WINAPI CryptMsgCalculateEncodedLength(
聽(tīng) DWORD dwMsgEncodingType,//鎸囧畾緙栫爜綾誨瀷銆備竴鑸負(fù)X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
聽(tīng) DWORD dwFlags,
聽(tīng) DWORD dwMsgType,
聽(tīng) const void* pvMsgEncodeInfo, //in 鎸囧悜寰呯紪鐮佺殑鏁版嵁錛屾暟鎹被鍨嬩緷璧栦簬dwMsgType
聽(tīng) LPSTR pszInnerContentObjID,
聽(tīng) DWORD cbData聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in 姣旂壒鏁扮殑瀹歸噺
);
絎簩涓弬鏁幫細(xì)CMSG_BARE_CONTENT_FLAG錛孋MSG_DETACHED_FLAG錛孋MSG_CONTENTS_OCTETS_FLAG錛孋MSG_CMS_ENCAPSULATED_CONTENT_FLAG
絎笁涓弬鏁幫細(xì)CMSG_DATA,CMSG_SIGNED,CMSG_ENVELOPED,CMSG_SIGNED_AND_ENVELOPED,CMSG_HASHED,CMSG_ENCRYPTED
絎簲涓弬鏁幫細(xì)szOID_RSA_data,szOID_RSA_signedData,szOID_RSA_envelopedData,szOID_RSA_signEnvData,szOID_RSA,digestedData ,
szOID_RSA_encryptedData,SPC_INDIRECT_DATA_OBJID,NULL
榪斿洖鍊鹼細(xì)榪斿洖闇瑕佺殑涓涓姞瀵嗕俊鎭墍闇瑕佺殑闀垮害
聽(tīng) 2錛孋ryptMsgOpenToEncode鎵撳紑涓涓秷鎭互渚胯繘琛岀紪鐮侊紝榪斿洖鎵撳紑娑堟伅鐨勫彞鏌?br />聽(tīng) HCRYPTMSG WINAPI CryptMsgOpenToEncode(
聽(tīng) DWORD dwMsgEncodingType,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //鎸囧畾緙栫爜綾誨瀷銆備竴鑸負(fù)X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng) DWORD dwMsgType,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng) const void* pvMsgEncodeInfo,
聽(tīng) LPSTR pszInnerContentObjID,聽(tīng)聽(tīng)聽(tīng) //鍜孋ryptMsgCalculateEncodedLength涓鏍?br />聽(tīng) PCMSG_STREAM_INFO pStreamInfo //褰撴祦娌¤浣跨敤鏃訛紝璇ュ弬鏁頒負(fù)NULL
);
絎簩涓弬鏁幫細(xì)CMSG_BARE_CONTENT_FLAG,CMSG_DETACHED_FLAG,CMSG_CONTENTS_OCTETS_FLAG,CMSG_CMS_ENCAPSULATED_CONTENT_FLAG,
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
絎笁涓弬鏁幫細(xì)
CMSG_DATA(Not used),CMSG_SIGNED,CMSG_SIGNED_ENCODE_INFO,CMSG_ENVELOPED,CMSG_ENVELOPED_ENCODE_INFO
CMSG_SIGNED_AND_ENVELOPED(Not currently implemented),CMSG_HASHED
聽(tīng) 3錛孋ryptMsgOpenToDecode鎵撳紑涓涓秷鎭互渚胯繘琛岃В鐮侊紝榪斿洖鎵撳紑娑堟伅鐨勫彞鏌?br />聽(tīng) CRYPTMSG WINAPI CryptMsgOpenToDecode(
聽(tīng) DWORD dwMsgEncodingType,聽(tīng)聽(tīng)聽(tīng)聽(tīng) //鎸囧畾緙栫爜綾誨瀷銆備竴鑸負(fù)X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
聽(tīng) DWORD dwFlags,聽(tīng)聽(tīng) //CMSG_DETACHED_FLAG錛孋MSG_CRYPT_RELEASE_CONTEXT_FLAG
聽(tīng) DWORD dwMsgType, //CMSG_DATA,CMSG_ENVELOPED,CMSG_HASHED,CMSG_SIGNED,CMSG_SIGNED_AND_ENVELOPED
聽(tīng) HCRYPTPROV hCryptProv,聽(tīng)聽(tīng)聽(tīng) //鎸囧畾浣跨敤HASHING鐨勫彞鏌勶紝涓鑸緗負(fù)0
聽(tīng) PCERT_INFO pRecipientInfo,//淇濈暀瀛楋紝蹇呴』涓篘ULL
聽(tīng) PCMSG_STREAM_INFO pStreamInfo//鍋囧嫻佹病琚嬌鐢紝蹇呴』涓篘ULL
);
聽(tīng) 4錛孋ryptMsgUpdate澧炲姞鍐呭鍒板姞瀵嗕俊鎭腑
BOOL WINAPI CryptMsgUpdate(
聽(tīng) HCRYPTMSG hCryptMsg, //寰呮洿鏂扮殑鍔犲瘑淇℃伅鍙ユ焺
聽(tīng) const BYTE* pbData,聽(tīng) //寰呯紪鐮?瑙g爜鐨勬暟鎹?br />聽(tīng) DWORD cbData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // pbData 鐨勬暟鎹暱搴?br />聽(tīng) BOOL fFinal聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
);
絎洓涓弬鏁幫細(xì)褰揅MSG_DETACHED_FLAG娌℃湁璁劇疆錛屽茍涓斾俊鎭敱CryptMsgOpenToDecode鎴朇ryptMsgOpenToEncode鎵撳紑錛岄偅涔坒Final琚緗負(fù)TRUE錛屽茍涓擟ryptMsgUpdate鍙璋冪敤涓嬈°傚綋CMSG_DETACHED_FLAG琚緗紝騫朵笖淇℃伅鐢?CryptMsgOpenToEncode鎵撳紑錛岄偅涔堜粎鍦ㄦ渶鍚庝竴嬈¤皟鐢–ryptMsgUpdate鎵嶈璁劇疆涓篢RUE銆傚綋CMSG_DETACHED_FLAG琚緗紝騫朵笖淇℃伅鐢盋ryptMsgOpenToDecode鎵撳紑錛岄偅涔堜粎鍦ㄤ俊鎭ご鍗曠嫭琚鐞嗘椂CryptMsgUpdate鎵嶈璁劇疆涓篢RUE銆?br />聽(tīng) 5錛孋ryptMsgGetParam鍦ㄦ暟鎹紪鐮?瑙g爜鍚庤幏鍙栧弬鏁?br />聽(tīng) BOOL WINAPI CryptMsgGetParam(
聽(tīng) HCRYPTMSG hCryptMsg,聽(tīng) //in 淇℃伅鍙ユ焺
聽(tīng) DWORD dwParamType,聽(tīng)聽(tīng) //in 鍙傛暟浼楀錛屽弬瑙丮SDN
聽(tīng) DWORD dwIndex,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in 鍙傜敤鐨勮繑鍥炲弬鏁板彞鏌?鍋囧鍙傛暟娌℃湁琚幏鍙栵紝鍒欒蹇界暐鎴栧垯涓?
聽(tīng) void* pvData,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //out 鑾峰彇鐨勬暟鎹寚閽?br />聽(tīng) DWORD* pcbData聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) //in,out鏁版嵁闀垮害
);
聽(tīng)聽(tīng) 6錛孋ryptMsgClose鍏抽棴淇℃伅鍙ユ焺
BOOL WINAPI CryptMsgClose(
聽(tīng) HCRYPTMSG hCryptMsg
);
鍏蜂綋鐨勪緥瀛愶細(xì)
cbEncodedBlob = CryptMsgCalculateEncodedLength(
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) MY_ENCODING_TYPE,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Message encoding type
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 0,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Flags
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) CMSG_DATA,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Message type
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Pointer to structure
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Inner content object ID
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) cbContent))聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Size of content
hMsg = CryptMsgOpenToEncode(
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) MY_ENCODING_TYPE,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Encoding type
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 0,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Flags
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) CMSG_DATA,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Message type
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Pointer to structure
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Inner content object ID
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL))聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Stream information (not used)
CryptMsgUpdate(
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) hMsg,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Handle to the message
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) pbContent,聽(tīng)聽(tīng)聽(tīng) // Pointer to the content
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) cbContent,聽(tīng)聽(tīng)聽(tīng) // Size of the content
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) TRUE))聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Last call
{
CryptMsgGetParam(
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) hMsg,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Handle to the message
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) CMSG_BARE_CONTENT_PARAM,聽(tīng)聽(tīng) // Parameter type
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 0,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Index
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) pbEncodedBlob,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Pointer to the BLOB
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) &cbEncodedBlob))聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Size of the BLOB
CryptMsgClose(hMsg);
hMsg = CryptMsgOpenToDecode(
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) MY_ENCODING_TYPE,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Encoding type.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 0,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Flags.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) CMSG_DATA,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Look for a data message.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Cryptographic provider.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL,聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Recipient information.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) NULL))聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) // Stream information.