The Cryptography API, or How to Keep a Secret(四) (轉)
生成密鈅:CryptDeriveKey, CryptGenKey, CryptDestroyKey
這三個用來產生密鈅控制程式碼: :namespace prefix = o ns = "urn:schemas--com::office" />
- CryptDeriveKey 函式從一個指定的密碼(pass)產生密鈅。
- CryptGenKey 函式從一個隨機產生的數值產生密鈅。
- CryptDestroyKey 函式釋放密鈅。
使用CryptGenKey 函式時,建議使用 CRYPT_EXPORTABLE 引數以建立一個可匯出的會話密鈅。這會建立一個可從一臺機器移到另一臺機器的值。不提供此引數,返回值僅在此機器/會話中有效。
下面是如何使用 CryptDeriveKey 函式的例子,假定 pPassword 指向一個指定的密碼, dwPasswordLength 為密碼長度。
#include /* 對於非C/C++使用者,此處用到的常量如下: #define ALG_CLASS_HASH (4 << 13) #define ALG_TYPE_ANY (0) #define ALG_SID_MD5 3 #define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5) #define CRYPT_EXPORTABLE 0x00000001 #define ALG_CLASS_DATA_ENCRYPT (3 << 13) #define ALG_TYPE_STREAM (4 << 9) #define ALG_SID_RC2 2 #define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_RC4) */ BOOL bResult; HCRYPTHASH hHash; HCRYPTKEY hKey; // 獲得雜湊物件控制程式碼 bResult = CryptCreateHash( hProv, // 之前獲得的CSP控制程式碼 CALG_MD5, // 雜湊演算法 0, // 非密鈅雜湊 0, // 置0 &hHash); // 儲存雜湊物件控制程式碼的變數 // 雜湊資料 bResult = CryptHashData( hHash, // 雜湊物件控制程式碼 pPassword, // 指向密碼的指標 dwPasswordLength, // 資料長度 0); // 未指定值 // 從指定的密碼產生密鈅 bResult = CryptDeriveKey( hProv, // 之前獲得的CSP控制程式碼 CALG_RC4, // 流 hHash, // 密碼雜湊後物件控制程式碼 CRYPT_EXPORTABLE, // 密鈅可匯出 &hKey); // 儲存密鈅物件控制程式碼的變數 . . . // 用密鈅進行操作 . . . // 釋放雜湊物件 CryptDestroyHash(hHash); // 釋放密鈅物件 CryptDestroyKey(hKey); 簡單來說,儘管不全對,加密API 處理資料是圍繞兩個函式—加密(CryptEncrypt) 與解密(CryptDecrypt)。 這兩個函式非常易用,但需要對其引數進行一下說明 : 緩衝區長度的問題可以在加密前透過CryptEncrypt 函式返回需要緩衝區的尺寸來解決。下面的例子程式碼演示了這種技術。在這個例子中,某些值已假定之前已獲得,我們僅要加密pData指向的緩衝區中dwDataLen位元組長的資料。 BOOL bResult; PBYTE pBuffer; DWORD dwSize; // 將緩衝中資料長度賦給變數 dwSize = dwDataLen; // 讓API返回給我們需要的緩衝長度 bResult = CryptEncrypt( hKey, // 之前獲得的密鈅物件 0, // 不雜湊資料 TRUE, // 最後的還是緩衝的資料 0, // 必須置0 NULL, // 無資料,簡單的返回尺寸 &dwSize, // 資料的尺寸 dwSize); // 資料塊尺寸 // 現在得到了輸出緩衝區尺寸,建立此緩衝區 pBuffer = new char[dwSize]; // 加密資料 bResult = CryptEncrypt( hKey, // 之前獲得的密鈅物件 0, // 不雜湊資料 TRUE, // 最後的還是緩衝的資料 0, // 必須置0 pBuffer, // 資料緩衝區 &dwSize, // 資料尺寸 dwSize); // 資料塊尺寸 當使用同一個密鈅進行加密或解密兩個資料流時,必須採取一些措施。同一個物理會話密鈅不得被用於同一個操作,因為每個會話密鈅容器的內部狀態資訊在同時進行一個操作時會混亂。對此問題的簡單解決辦法是製作一份會話密鈅的複製。這樣,原始密鈅進行一個操作,複製密鈅進行另一個操作。加密與資料:CryptEncrypt, CryptDecrypt
同時進行加密與解密
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974696/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 1.1 Cryptography and Modern Cryptography
- secret
- Secret Sport
- paramiko 2.4.2 has requirement cryptography>=1.5, but you'll have cryptography 1.3.1 which is incompUIREM
- [密碼學複習]Cryptography密碼學
- How to return plain text from AWS Lambda & API GatewayAIAPIGateway
- View and Data API Tips: how to make viewer full screenViewAPI
- Css Secret 案例全套CSS
- Android Secret CodeAndroid
- How Users Read on the Web (轉)Web
- [轉]How to release space from databaseDatabase
- Example: How to Packetize a TCP Stream (轉)TCP
- 轉:How is Internat Bank going?Go
- [轉]how to introduce yourself in the interviewView
- Oracle中分組查詢時keep的使用[轉][Oracle
- System.Security.Cryptography 名稱空間
- pwn.college intro-to-cybersecurity cryptography
- How Oracle Store Number internal?(轉載)Oracle
- 阻塞佇列——四組API佇列API
- http keep-alive與tcp keep-aliveHTTPKeep-AliveTCP
- k8s之SecretK8S
- Api32 keygen: learn how to use RSA (4千字)API
- Oracle keep的用法Oracle
- KEEP INDEX | DROP INDEXIndex
- 【筆記】【THM】Introduction to Cryptography(密碼學簡介)筆記密碼學
- [譯 ] 如何使用 AJAX 和 REST API 建立一個圖表(How To Make A Chart Using AJAX & REST API's)RESTAPI
- iOS之runtime詳解api(四)iOSAPI
- Natasha 4.0 探索之路系列(四) 模板 APIAPI
- 轉載:有關SQL server connection Keep Alive 的FAQ(2)SQLServer
- 轉載:有關SQL server connection Keep Alive 的FAQ(3)SQLServer
- No MFC,Only API (轉)API
- vue <keep-alive>VueKeep-Alive
- Keep不甘做“工具人”
- vue keep-aliveVueKeep-Alive
- keep-loader for webpackWeb
- BZOJ4255 : Keep Fit!
- laravel 獲取token 'secret' of non-objectLaravelObject
- Mac的秘密資料夾:Secret FolderMac