zoukankan      html  css  js  c++  java
  • c++ 基于wincrypt的DES CBC模式加解密

    des.h

     

    #pragma once
    #include <windows.h>
    #include <atlstr.h>
    #include <wincrypt.h>
    typedef struct
    {
    BLOBHEADER header;
    DWORD cbKeySize;
    BYTE rgbKeyData[8];
    }KeyBlob;
    const BYTE IV[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    DWORD DESEncrypt(CString data, CString password, BYTE * buffer, DWORD bufferLength);
    DWORD DESDecrypt(BYTE* buffer, DWORD bufferLength, CString password);

    ***************************************************************

    des.cpp

    #include "des.h"
    DWORD DESEncrypt(CString data, CString password, BYTE* buffer, DWORD bufferLength)
    {
    CT2CA passwd(password, CP_UTF8);
    CT2CA secret(data, CP_UTF8);
    DWORD dataLength = strlen(secret);
    if (buffer == NULL || bufferLength < dataLength + 8 - (dataLength % 8) || password.GetLength() < 8) return 0;
    memcpy(buffer, secret, dataLength);
    HCRYPTPROV hProv = NULL;
    HCRYPTKEY hSessionKey = NULL;
    BOOL bResult = TRUE;
    KeyBlob blob;
    blob.header.bType = PLAINTEXTKEYBLOB;
    blob.header.bVersion = CUR_BLOB_VERSION;
    blob.header.reserved = 0;
    blob.header.aiKeyAlg = CALG_DES;
    blob.cbKeySize = 8;
    memcpy(blob.rgbKeyData, passwd, 8);
    bResult &= CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0);
    bResult &= CryptImportKey(hProv, (BYTE*)&blob, sizeof(blob), 0, 0, &hSessionKey);
    bResult &= CryptSetKeyParam(hSessionKey, KP_IV, (BYTE*)IV, 0);
    bResult &= CryptEncrypt(hSessionKey, NULL, TRUE, 0, (BYTE*)buffer, &dataLength, bufferLength);
    bResult &= CryptDestroyKey(hSessionKey);
    bResult &= CryptReleaseContext(hProv, 0);
    return bResult ? dataLength : 0;
    }
    DWORD DESDecrypt(BYTE* buffer, DWORD bufferLength, CString password)
    {
    CT2CA passwd(password, CP_UTF8);
    DWORD dataLength = bufferLength;
    if (buffer == NULL || password.GetLength() < 8) return 0;
    HCRYPTPROV hProv = NULL;
    HCRYPTKEY hSessionKey = NULL;
    BOOL bResult = TRUE;
    KeyBlob blob;
    blob.header.bType = PLAINTEXTKEYBLOB;
    blob.header.bVersion = CUR_BLOB_VERSION;
    blob.header.reserved = 0;
    blob.header.aiKeyAlg = CALG_DES;
    blob.cbKeySize = 8;
    memcpy(blob.rgbKeyData, passwd, 8);
    bResult &= CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0);
    bResult &= CryptImportKey(hProv, (BYTE*)&blob, sizeof(blob), 0, 0, &hSessionKey);
    bResult &= CryptSetKeyParam(hSessionKey, KP_IV, (BYTE*)IV, 0);
    bResult &= CryptDecrypt(hSessionKey, NULL, TRUE, 0, buffer, &dataLength);
    bResult &= CryptDestroyKey(hSessionKey);
    bResult &= CryptReleaseContext(hProv, 0);
    return bResult ? dataLength : 0;
    }
    void main()
    {
    BYTE buffer[8] = { 0 };
    int dataLength = DESEncrypt("testt", "123456", buffer, sizeof(buffer));
    BYTE data[8] = { 0 };
    int bufferLength = sizeof(buffer);
    int _dataLength = DESDecrypt(buffer, bufferLength, "123456");
    char *dest = (char *)malloc((_dataLength + 1) * sizeof(char));
    memcpy(dest, buffer, _dataLength);
    dest[_dataLength] = '';//必须加结束符
    printf("result:%s", dest);
    getchar();
    }
  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/94cool/p/5801611.html
Copyright © 2011-2022 走看看