用CryptoAPI進行資料加密

2021-06-01 01:32:05 字數 3183 閱讀 6944

因為過於複雜的加密演算法實現起來非常困難,所以在過去,許多應用程式只能使用非常簡單的加密技術,這樣做的結果就是加密的資料很容易就可以被人破譯。而使用microsoft提供的加密應用程式介面(即cryptography api),或稱cryptoapi,就可以方便地在應用程式中加入強大的加密功能,而不必考慮基本的演算法。本文將對cryptoapi及其使用的資料加密原理作一簡單的介紹,然後給出了用cryptoapi編寫加密程式的大致步驟,最後以乙個檔案的加密、解密程式為例演示了cryptoapi的部分功能。

----1. cryptoapi簡介

---- cryptoapi是一組函式,為了完成數學計算,必須具有密碼服務提供者模組(csp)。microsoft通過**rsa base provider在作業系統級提供乙個csp,使用rsa公司的公鑰加密演算法,更多的csp可以根據需要增加到應用中。事實上,csp有可能與特殊硬體裝置(如智慧卡)一起來進行資料加密。cryptoapi介面允許簡單的函式呼叫來加密資料,交換公鑰,雜湊乙個訊息來建立摘要以及生成數字簽名。它還提供高階的管理操作,如從一組可能的csp中使用乙個csp。此外,cryptoapi還為許多高階安全性服務提供了基礎,包括用於電子商務的set,用於加密客戶機/伺服器訊息的pct,用於在各個平台之間來回傳遞機密資料和金鑰的pfx,**簽名等等。cryptoapi的體系結構如下圖:

---- 目前支援cryptoapi的windows系統有:windows 95 osr2、windows nt sp3及後續版本、windows 98、windows 2000等。cryptoapi的配置資訊儲存在登錄檔中,包括如下金鑰:

hkey_local_machine\software\

microsoft \ cryptography \defaults

hkey_current_user\ software \ microsoft

\ cryptography \providers

----2.資料加密原理

---- 資料加密的流程如下圖:

---- cryptoapi使用兩種金鑰:會話金鑰與公共/私人金鑰對。會話金鑰使用相同的加密和解密金鑰,這種演算法較快,但必須保證金鑰的安全傳遞。公共/私人金鑰對使用乙個公共金鑰和乙個私人金鑰,私人金鑰只有專人才能使用,公共金鑰可以廣泛傳播。如果金鑰對中的乙個用於加密,另乙個一定用於解密。公共/私人金鑰對演算法很慢,一般只用於加密小批資料,例如用於加密會話金鑰。

---- cryptoapi支援兩種基本的編碼方法:流式編碼和塊編碼。流式編碼在明碼文字的每一位上建立編碼位,速度較快,但安全性較低。塊編碼在乙個完整的塊上(一般為64位)上工作,需要使用填充的方法對要編碼的資料進行捨入,以組成多個完整的塊。這種演算法速度較慢,但更安全。

----3.應用舉例

---- 下面以兩個檔案加密與解密的c程式片斷為例,演示一下cryptoapi的強大功能。這兩個程式均為win32控制台應用,程式省略了出錯處理,實際執行時**入。

---- ①檔案加密

#include < windows.h >

#include < stdio.h >

#include < stdlib.h >

#include < wincrypt.h >

//確定使用rc2塊編碼或是rc4流式編碼

#ifdef use_block_cipher

#define encrypt_algorithmcalg_rc2

#define encrypt_block_size8

#else

#define encrypt_algorithmcalg_rc4

#define encrypt_block_size1

#endif

void capidecryptfile(pchar szsource,

pchar szdestination, pchar szpassword);

void _cdecl main(int argc, char *argv)

//讀取引數.

szsource = argv[1];

szdestination = argv[2];

if(argc == 4)

capidecryptfile(szsource, szdestination, szpassword);

}/*szsource為要加密的檔名稱,szdestination

為加密過的檔名稱,szpassword為加密口令*/

void capiencryptfile(pchar szsource, pchar

szdestination, pchar szpassword)

else

//計算一次加密的資料位元組數,必須為encrypt_block_size的整數倍

dwblocklen = 1000 - 1000 % encrypt_block_size;

//如果使用塊編碼,則需要額外空間

if(encrypt_block_size > 1) else

//分配緩衝區

pbbuffer = malloc(dwbufferlen);

//加密原始檔並寫入目標檔案

do while(!feof(hsource));

printf("ok\n");

……//關閉檔案、釋放記憶體

}②檔案解密

void capidecryptfile(pchar szsource, pchar

szdestination, pchar szpassword)

else

dwblocklen = 1000 - 1000 % encrypt_block_size;

if(encrypt_block_size > 1) else

pbbuffer = malloc(dwbufferlen);

//解密原始檔並寫入目標檔案

do while(!feof(hsource));

printf("ok\n");

……//關閉檔案、釋放記憶體

}

---- 以上**在windows nt4.0、visual c++6.0環境中編譯通過。

---- 除直接用於加密資料外,cryptoapi還廣泛用於產生並確認數字簽名,這裡就不一一舉例說明了,有興趣的讀者可以參考msdn文件。

用CryptoAPI進行資料加密

vckbase online help journal no.10 南京理工大學計算機系 胡靜 李蔚清 因為過於複雜的加密演算法實現起來非常困難,所以在過去,許多應用程式只能使用非常簡單的加密技術,這樣做的結果就是加密的資料很容易就可以被人破譯。而使用microsoft提供的加密應用程式介面 即cr...

用bcp進行資料庫資料備份

bcp 簡 要 說 明 bcp是sybase公司提供專門用於資料庫表一級資料備份的工具。一般存放在所安裝的ase或者open client 的bin目錄中。12版本以前的ase,bcp存放目錄為 sybase bin 12版本 含12版本 以後存放目錄為 sybase ocs 12 x bin 其中...

用R語言進行資料分析

用美國 台網公布的全球2013年5月20日22點到24點發生的所有 的震級資料實驗。mag mag 1 1.6 0.9 2.1 2.2 2.3 1.7 1.3 1.6 4.7 1.2 0.9 4.7 0.6 5.3 1.1 4.8 4.0 4.2 4.6 1.3 2.1 1.5 3.0 factor...