用CryptoAPI實現DES加密解密

2021-06-22 08:05:20 字數 1882 閱讀 7476

#include #include #include bool des(__in const byte* pbkey,

__in dword cbkeylen,

__in const byte* pbdata,

__in dword cbdatalen,

__out byte* pbbuf,

__inout dword* pcbbuflen,

__in bool bisdecrypt = false

)/* des加密、解密函式,使用pkcs 5 padding,cbc模式

引數:pbkey des金鑰

cbkeylen pbkey位元組長度

pbdata 要加密、解密的資料

cbdatalen pbdata位元組長度

pbbuf 輸出緩衝區,輸出加密後、解密後的資料,可以為null

pcbbuflen pbbuf位元組長度

當pbbuf不為null時,返回實際複製到pbbuf的位元組長度

當pbbuf為null時,返回需要的pbbuf位元組長度

bisdecrypt 為true時執行解密操作,否則執行加密操作

返回:成功返回true,否則返回false

*/ keyblob; //結構參考msdn - cryptimportkey

keyblob.hdr.btype = plaintextkeyblob;

keyblob.hdr.bversion = cur_blob_version;

keyblob.hdr.reserved = 0;

keyblob.hdr.aikeyalg = calg_des;

keyblob.cbkeysize = 8;

zeromemory(keyblob.rgbkeydata, 8);

copymemory(keyblob.rgbkeydata, pbkey, cbkeylen > 8 ? 8 : cbkeylen);

hcryptprov hprov;

if (!cryptacquirecontext(&hprov, null, ms_def_prov, prov_rsa_full, 0))

return false;

hcryptkey hkey;

if (!cryptimportkey(hprov, (byte*)&keyblob, sizeof(keyblob), 0, 0, &hkey))

bool bret;

byte pbblock[16];

dword dwblock, dwout = 0;

bool beof;

for (dword i = 0; i < cbdatalen; i += 8)

else

} else //當pbbuf為null時,僅計算需要多大的pbbuf

dwout += dwblock;

} *pcbbuflen = dwout;

cryptdestroykey(hkey);

cryptreleasecontext(hprov, 0);

return bret;}

int _tmain()

測試:金鑰:1204

資料:starsunyzl

加密結果:ca3c24e48dd8aa551e98f3a989d38a49

注意這段**使用的是pkcs 5 padding,而網上的一些演算法測試工具使用的是zero padding,所以得到的結果不一定一樣,微軟提供的csps不支援zero padding,要使用zero padding的話必須自己填0把最後一組資料補齊8位元組後再加密,並且僅取加密結果的前8位元組資料,因為後8位元組是多出來的padding

用CryptoAPI進行資料加密

因為過於複雜的加密演算法實現起來非常困難,所以在過去,許多應用程式只能使用非常簡單的加密技術,這樣做的結果就是加密的資料很容易就可以被人破譯。而使用microsoft提供的加密應用程式介面 即cryptography api 或稱cryptoapi,就可以方便地在應用程式中加入強大的加密功能,而不必...

用CryptoAPI進行資料加密

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

java實現DES演算法

public static void main string args catch transformerexception e system.out.println time system.nanotime start 1000 1000 public desdatatransformer str...