• 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();
    }
  • 相关阅读:
    JD20 紧急疏散
    排序-归并
    排序:快排
    剑指offer-二叉树镜像
    美的笔试--分糖果
    centos限定端口访问
    javascript中使用ajax异步验证数据库后方法return true时总是返回undefined
    javascript自定义startWith()和endWith()方法
    jsp <input type="file"> 清空value值的一种方式
    Could not initialize class sun.awt.X11GraphicsEnvironment
  • 原文地址:https://www.cnblogs.com/94cool/p/5801611.html
Copyright © 2020-2023  润新知