• 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();
    }
  • 相关阅读:
    numpy学习(将条件逻辑表述为数组运算)
    numpy学习(利用数组进行数据处理)
    numpy学习(通用函数:快速的元素级数组函数)
    numpy学习(数组转置和轴对换)
    numpy学习(花式索引)
    关于C++中的虚拟继承的一些总结
    adb常用命令
    进程隐藏的方法
    Microsoft Detours 2.1简介
    ebay如何确定同一电脑登陆了多个账号,以及同一账号登陆过多台电脑
  • 原文地址:https://www.cnblogs.com/94cool/p/5801611.html
Copyright © 2020-2023  润新知