使用API函数CryptProtectData和CryptUnprotectData进行字符串加解密

简介: #include #include #include #include #include  #include  #include  using namespace std;void Handl...
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#include <fstream>
#include <string> 
#include <algorithm> 
#include <list> 


using namespace std;


void HandleError(char *s)
{
     fprintf(stderr, "An error occurred in running the program. /n");
     fprintf(stderr, "%s/n",s);
     fprintf(stderr, "Error number %d./n", GetLastError());
     fprintf(stderr, "Program terminating. /n");
     //exit(1);
     return;
}


void main()
{


    DATA_BLOB DataIn1;
    DATA_BLOB DataOut1;
    // mstsc.exe中使用的是unicode,所以必须做宽字符转换
    BYTE *pbDataInput1 =(BYTE *)L"freedom";
    DWORD cbDataInput1 = wcslen(L"freedom")*sizeof(wchar_t);


    DataIn1.pbData = pbDataInput1;
    DataIn1.cbData = cbDataInput1;


    FILE *fp;


    if(CryptProtectData(
        &DataIn1,
        L"psw",                                // A description string
                                            // to be included with the
                                            // encrypted data.
        NULL,                               // Optional entropy not used.
        NULL,                               // Reserved.
        NULL,                               // Pass NULL for the
                                            // prompt structure.
        0,
        &DataOut1))
    {
        printf("The encryption phase worked./n");


        fp = fopen("password.txt","w");


        int count=0;
        while ( count <= (int)DataOut1.cbData ){
            // 因为一个unsigned int 占32位
            // 转换成成16进制要占两位
            // 所以这里需要用%02
            fprintf(fp,"%02X",DataOut1.pbData[count]);
            count++;
        }


        fclose(fp);


    }else{
        printf("Encryption error using CryptProtectData./n");
        exit(1);
    }


    ifstream in("password.txt"); 


    list<string> lst; 
    char   buf[1024]; 
    while(in) 
    { 
        in.getline(buf,1024); 
        lst.push_back(buf); 
    } 


    list<string>::iterator   iter, iterBegin;    
    string strPwd;
    iterBegin = lst.begin();
    strPwd = *iterBegin;
    iterBegin++;
    for(iter   =   iterBegin;   iter   !=   lst.end();   iter++) 
    { 
        strPwd += *iter;
    } 


    DATA_BLOB DataOut;
    DATA_BLOB DataVerify;
    LPWSTR pDescrOut = NULL;
    BYTE *pbDataOutput;
    DWORD cbDataOutput;
    int data;


    // Put encrypted password string here
    //char *szEncodedPwd = new char[strlen(strPwd.c_str()) + 1];    
    //strcpy(szEncodedPwd, strPwd.c_str());
    char szEncodedPwd[] = "51:b:01000000D08C9DDF0115D1118C7A00C04FC297EB010000005A95766D6AED2744AA27C4F51CCF71C70000000008000000700073007700000003660000A800000010000000738B7545A4E609D5E627D2340668C2230000000004800000A000000010000000980CFB0F5DF7B89D57AE2DA3708DE0C6080200001F933C9215C8548A2C591A0D3C659D53FE45BCB4AE770E4B0369D4EC6D9804B6C094FB7181632C3E41E35350E742FEA14308FD87D9BAA190B0253DA92CEFC2439DCEAEAEBA108E7030DBC0ACF973E28C058FB180086A21DD809CF37F463AF7BE2B0088880F706FCB6D1722368959A4F8A885257A06DBD153B735376FB0267218F1771668A660EA81188EDDDB650A314091233B99EC2FF6361BEDEC532603A86882AEBBC597836DADF40E882A2C8EC16FAB2018E73E40187BF913C307EEF9CA4A6664BD39AAD163348D67A75EB12460A1EA8840E416BAA80D5724C4F17A6CB71621F3841B1AF1B2AC40C9E4725847B7487B22A7E42542E321B84F0561FF73A1DD6B199E1DBAFB12881ABB5332B33B956AE431F4E20A61DA94175A7F1597FDF1C205E7975C8FD8CEAB78B18528EB57CB93D518880E62797E3B2226673B43B36D2BA118235F4D265344E07D195AC0B07398DB5776E524D7FEC121DFCAEBABA578D9ABA1F5A3E6DEC3DF72FC64D4516F2B2BEFEDCAFD4E21C5C53BD79F908D11E4BAC4608E2E1A3F7A0100AE324DE31EC4CC6E7B69CD768483A93C6B31F84CCFD4B2507991FCF0EC3CB45F68DBE179038574664F0FE5FE2CA9C3E790C3EFA32984DEDC2D563F23EEF4B03F2C1A34B01BDAE05FFB854821B6EFEEA0CF1EAF9AAA769D24862EFC5E3D24DD475736FDC6B70E0F9ABB21AF8B80C36D8D3F473D4AEC52B71E08F9F980014F3C14000000D2542DC2A708785AF43A4DB07FD5DB36628176D60";


    // String conversion
    cbDataOutput = ( (strlen(szEncodedPwd)) / 2 );
    pbDataOutput = (BYTE *)malloc( cbDataOutput + 1 );
    if (pbDataOutput == NULL) HandleError("Not enough memory.");


    for (unsigned int i=0; i<(cbDataOutput); i++) {
        sscanf(&(szEncodedPwd[i+i]), "%02x", &data);
        pbDataOutput = data;
    }
    DataOut.pbData = pbDataOutput;
    DataOut.cbData = cbDataOutput;


    // Decryption
    if (CryptUnprotectData(
        &DataOut, // [in] Input data
        &pDescrOut, // (Optional) [out] Description string
        NULL, // (Optional) [in] Entropy (not used by MS)
        NULL, // Reserved
        NULL, // (Optional) PromptStruct
        0, // Flags
        &DataVerify)) // [out] Output data
    {
        wprintf(L"The decrypted data is: %s/n", (WCHAR *)DataVerify.pbData);
        printf("The description of the data was: %S/n", pDescrOut);
    }else{
        HandleError("解密错误!");
    }


    LocalFree(pDescrOut);
    free(DataOut.pbData);
    LocalFree(DataVerify.pbData);


    //delete [] szEncodedPwd;
    system("pause");

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
1月前
|
缓存 JavaScript 算法
活用 Composition API 核心函数,打造卓越应用(下)
活用 Composition API 核心函数,打造卓越应用(下)
|
1月前
|
存储 JavaScript API
活用 Composition API 核心函数,打造卓越应用(上)
活用 Composition API 核心函数,打造卓越应用(上)
|
1月前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
39 3
|
30天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
92 3
|
4月前
|
存储 API 数据安全/隐私保护
FreeRTOS入门教程(信号量的概念及API函数使用)
FreeRTOS入门教程(信号量的概念及API函数使用)
101 0
|
6月前
|
存储 Java API
API及String类和字符串相关使用方法
API及String类和字符串相关使用方法
|
9月前
|
API
讨论问题--数据类型、数组、传值/址API函数等
讨论问题--数据类型、数组、传值/址API函数等
45 0
|
9月前
|
数据采集 JSON 监控
zabbix-API对接实录:关键基础设施数据清洗和封装函数(php数组函数、数据清洗、数据结构化)
zabbix-API对接实录:关键基础设施数据清洗和封装函数(php数组函数、数据清洗、数据结构化)
41 0
|
9月前
|
JSON API PHP
漏刻有时API接口实战开发系列(6):PHP开发API接口离不开的curl函数封装
漏刻有时API接口实战开发系列(6):PHP开发API接口离不开的curl函数封装
54 0
|
9月前
|
API PHP
php函数API接口的一段代码,不为什么就是想放在这里
php函数API接口的一段代码,不为什么就是想放在这里
35 0