CryptProtectData/CryptUnprotectData加解密
2010-11-17 10:10
197 查看
#include "stdafx.h"
#include <string>
#include <WTypes.h>
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#include <sstream>
using namespace std;
const char* Hex2ASC( const BYTE* Hex, int Len)
{
static char ASC[4096 * 2];
int i;
for (i = 0; i < Len; i++)
{
ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4];
ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
}
ASC[i * 2] = '/0';
return ASC;
}
std::string Hex2ASC_( const BYTE* Hex, int Len)
{
std::string str;
char ASC[3] = {0};
ASC[2] = '/0';
int i;
for (i = 0; i < Len; i++)
{
ASC[0] = "0123456789ABCDEF"[Hex[i] >> 4];
ASC[1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
str += ASC;
}
return str;
}
int HexStringToByte(LPCSTR lpHex, LPBYTE* ppByte)
{
std::string straHex = lpHex;
int nHexLen = straHex.size();
// assert(nHexLen%2 == 0);
LPBYTE lpByte = new byte[nHexLen/2];
int nCount = 0;
for (int i=0; i<nHexLen/2; i++)
{
std::stringstream ss;
DWORD bb;
ss << straHex.at(i*2);
ss << straHex.at(i*2+1);
ss << '/0';
ss >> std::hex >> bb;
lpByte[i] = bb;
nCount++;
}
*ppByte = lpByte;
return nCount;
}
std::string ProtectData(LPSTR lpszText)
{
DATA_BLOB DataIn;
DATA_BLOB DataOut;
// mstsc.exe中使用的是unicode,所以必须做宽字符转换
BYTE *pbDataInput =(BYTE *)lpszText;
DWORD cbDataInput = strlen(lpszText)*sizeof(char);
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
std::string strPrt;
if(CryptProtectData(
&DataIn,
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,
&DataOut))
{
printf("The encryption phase worked./n");
strPrt = Hex2ASC(DataOut.pbData, DataOut.cbData);
LocalFree(DataOut.pbData);
}
return strPrt;
}
std::string UnProtectData(LPCSTR lpstr)
{
DATA_BLOB DataOut;
DATA_BLOB DataUnp;
LPBYTE lpByte = NULL;
int nLen = HexStringToByte(lpstr, &lpByte);
DataUnp.cbData = nLen;
DataUnp.pbData = lpByte;
// mstsc.exe中使用的是unicode,所以必须做宽字符转换
LPWSTR lpwstr = NULL;
BOOL bRet = CryptUnprotectData(&DataUnp, &lpwstr, NULL, NULL, NULL, 0, &DataOut);
LPSTR lpStrOut = new char[DataOut.cbData+1];
memcpy(lpStrOut, DataOut.pbData, DataOut.cbData);
lpStrOut[DataOut.cbData] = 0;
LocalFree(DataOut.pbData);
if (lpwstr)
{
LocalFree((HLOCAL)lpwstr);
}
if (lpByte)
{
delete[] lpByte;
}
std::string strRet = lpStrOut;
delete[] lpStrOut;
return strRet;
}
void main()
{
std::string strPrt = ProtectData("freedom!!!");
std::string strUnPrt = UnProtectData(strPrt.c_str());
//#define CONSTSTR "01000000D08C9DDF0115D1118C7A00C04FC297EB01000000B373EAAE3C9F3746B428C797A5742CBF0000000008000000700073007700000003660000A800000010000000F762A0B543ABC4D2E3E1ECB3706875760000000004800000A0000000100000006B5B19F40B51D8FA9BFB88FE2555784D08000000757F1FBD89068ED814000000BEF2822C2A836556E9320BD065870D0242A051F6"
// std::string strUnPrt = UnProtectData(CONSTSTR);
// std::string strUnPrt1 = UnProtectData(CONSTSTR);
// std::string strUnPrt2 = UnProtectData(CONSTSTR);
// std::string strUnPrt3 = UnProtectData(CONSTSTR);
}
#include <string>
#include <WTypes.h>
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#include <sstream>
using namespace std;
const char* Hex2ASC( const BYTE* Hex, int Len)
{
static char ASC[4096 * 2];
int i;
for (i = 0; i < Len; i++)
{
ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4];
ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
}
ASC[i * 2] = '/0';
return ASC;
}
std::string Hex2ASC_( const BYTE* Hex, int Len)
{
std::string str;
char ASC[3] = {0};
ASC[2] = '/0';
int i;
for (i = 0; i < Len; i++)
{
ASC[0] = "0123456789ABCDEF"[Hex[i] >> 4];
ASC[1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
str += ASC;
}
return str;
}
int HexStringToByte(LPCSTR lpHex, LPBYTE* ppByte)
{
std::string straHex = lpHex;
int nHexLen = straHex.size();
// assert(nHexLen%2 == 0);
LPBYTE lpByte = new byte[nHexLen/2];
int nCount = 0;
for (int i=0; i<nHexLen/2; i++)
{
std::stringstream ss;
DWORD bb;
ss << straHex.at(i*2);
ss << straHex.at(i*2+1);
ss << '/0';
ss >> std::hex >> bb;
lpByte[i] = bb;
nCount++;
}
*ppByte = lpByte;
return nCount;
}
std::string ProtectData(LPSTR lpszText)
{
DATA_BLOB DataIn;
DATA_BLOB DataOut;
// mstsc.exe中使用的是unicode,所以必须做宽字符转换
BYTE *pbDataInput =(BYTE *)lpszText;
DWORD cbDataInput = strlen(lpszText)*sizeof(char);
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
std::string strPrt;
if(CryptProtectData(
&DataIn,
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,
&DataOut))
{
printf("The encryption phase worked./n");
strPrt = Hex2ASC(DataOut.pbData, DataOut.cbData);
LocalFree(DataOut.pbData);
}
return strPrt;
}
std::string UnProtectData(LPCSTR lpstr)
{
DATA_BLOB DataOut;
DATA_BLOB DataUnp;
LPBYTE lpByte = NULL;
int nLen = HexStringToByte(lpstr, &lpByte);
DataUnp.cbData = nLen;
DataUnp.pbData = lpByte;
// mstsc.exe中使用的是unicode,所以必须做宽字符转换
LPWSTR lpwstr = NULL;
BOOL bRet = CryptUnprotectData(&DataUnp, &lpwstr, NULL, NULL, NULL, 0, &DataOut);
LPSTR lpStrOut = new char[DataOut.cbData+1];
memcpy(lpStrOut, DataOut.pbData, DataOut.cbData);
lpStrOut[DataOut.cbData] = 0;
LocalFree(DataOut.pbData);
if (lpwstr)
{
LocalFree((HLOCAL)lpwstr);
}
if (lpByte)
{
delete[] lpByte;
}
std::string strRet = lpStrOut;
delete[] lpStrOut;
return strRet;
}
void main()
{
std::string strPrt = ProtectData("freedom!!!");
std::string strUnPrt = UnProtectData(strPrt.c_str());
//#define CONSTSTR "01000000D08C9DDF0115D1118C7A00C04FC297EB01000000B373EAAE3C9F3746B428C797A5742CBF0000000008000000700073007700000003660000A800000010000000F762A0B543ABC4D2E3E1ECB3706875760000000004800000A0000000100000006B5B19F40B51D8FA9BFB88FE2555784D08000000757F1FBD89068ED814000000BEF2822C2A836556E9320BD065870D0242A051F6"
// std::string strUnPrt = UnProtectData(CONSTSTR);
// std::string strUnPrt1 = UnProtectData(CONSTSTR);
// std::string strUnPrt2 = UnProtectData(CONSTSTR);
// std::string strUnPrt3 = UnProtectData(CONSTSTR);
}
相关文章推荐
- WinCE5.0 CryptProtectData
- CryptProtectData 执行失败返回 87
- System.Exception: CryptUnprotectData: Win32 错误:-2146893813...待解决
- DPAPI(Data Protection API) 数据加密和解密
- 微信小程序解密encryptedData数据字符串,php中隐形字符65279(utf-8的BOM头)问题
- 开发者可以通过Data Protection API 来设定文件系统中的文件、keychain中的项应该何时被解密
- 【CodeVS 2083】Cryptcowgraphy 解密牛语
- DES(Data Encryption Standard)加密解密整理
- RSA 解密的时候报错 而且有乱码:java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
- [JAVA加解密]实例:对称加密网络应用DataServer
- UVa Problem 843 Crypt Kicker (解密)
- DES(Data Encryption Standard)加密解密整理
- efs解密-Advanced EFS Data Recovery2.1-含注册KEY
- UVa Problem 850 Crypt Kicker II (解密 II)
- DES (Data Encryption Standard)加密解密整理
- C#/.net微信小程序encryptedData解密
- CYQ.Data V5文本数据库技术原理解密
- Protect Your Windows Network : From Perimeter to Data
- spring mvc 自定义注解ResponseEncryptBody、RequestDecryptBody统一处理加密、解密数据,供移动端使用的rest服务
- CYQ.Data V5文本数据库技术原理解密