#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...