// CPPdesTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
//#include <windows.h>
//#include <fstream>
//#include "DES.h"

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#pragma comment( lib, "Advapi32.lib" )

std::string string_To_UTF8(const std::string & str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);

wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
ZeroMemory(pwBuf, nwLen * 2 + 2);

::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);

int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);

char * pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);

::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

std::string retStr(pBuf);

delete[]pwBuf;
delete[]pBuf;

pwBuf = NULL;
pBuf = NULL;

return retStr;
}

//
// for DES
//

typedef struct
{
BLOBHEADER header;
DWORD cbKeySize;
BYTE rgbKeyData[8];
}KeyBlob;

LPSTR ConvertGBKToUtf8(LPSTR strGBK)
{
int len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)strGBK, -1, NULL, 0);
wchar_t * wszUtf8 = new wchar_t[len + 1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPSTR)strGBK, -1, wszUtf8, len);

len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8 = new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);

return szUtf8;
}

void Base64Encode(BYTE *src, int src_len, BYTE *dst)
{

int i = 0, j = 0;

char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

for (; i < src_len - src_len % 3; i += 3) {

dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];

dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];

dst[j++] = base64_map[src[i + 2] & 0x3F];

}

if (src_len % 3 == 1) {

dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

dst[j++] = base64_map[(src[i] << 4) & 0x30];

dst[j++] = '=';

dst[j++] = '=';

}
else if (src_len % 3 == 2) {

dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];

dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];

dst[j++] = '=';

}

dst[j] = '\0';

}

DWORD DesEncrypt(char* szEncrypt, char* szKey, BYTE* szOut, DWORD nOutLen)
{
char* sz_utf8_buff = ConvertGBKToUtf8(szEncrypt);

DWORD dwEncrypt = strlen(sz_utf8_buff);

if (szOut == NULL || \
nOutLen < dwEncrypt + 8 - (dwEncrypt % 8) || \
strlen(szKey) < 8)
return 0;
memcpy(szOut, sz_utf8_buff, dwEncrypt);

//
// init
//

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, szKey, 8);

BYTE IV[9] = { 0 };
memcpy(IV, szKey, 8);

//
// start
//

CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0);
CryptImportKey(hProv, (BYTE*)&blob, sizeof(blob), 0, 0, &hSessionKey);
CryptSetKeyParam(hSessionKey, KP_IV, (BYTE*)IV, 0);

//
// Do
//

CryptEncrypt(hSessionKey, NULL, TRUE, 0, (BYTE*)szOut, &dwEncrypt, nOutLen);

//
// Clean
//

CryptDestroyKey(hSessionKey);
CryptReleaseContext(hProv, 0);
delete sz_utf8_buff;

return dwEncrypt;
}

char* Encrypt(char* sz_encrypt, char* sz_key)
{
BYTE szOut[1024] = { 0 };

//
// do Des crypt
//

DWORD dwRet = DesEncrypt(sz_encrypt, sz_key, szOut, 1024);

//
// do base64
//

int nLen = strlen((char*)szOut);
int nLenOut = nLen * 4 / 3;
BYTE* szBase64 = new BYTE[nLenOut + 1];

memset(szBase64, 0, nLenOut + 1);

Base64Encode(szOut, nLen, szBase64);

return (char*)szBase64;
}

int _tmain(int argc, _TCHAR* argv[])
{
string strParameter = "currentpage=1&pagesize=1000000&starttime=1514736000&endtime=1514822399&paystatus=";
string k = "punr8ucu";
string strRequest = "";//xlthPeJpBC4cqLKTf2zpi8I8c3vzPf606LZkwaKLpdaJ6GwXiPaVKg0SWEB4gWspMnO9st2IDJdSmNH8r1VQkpPahPkQPeb+caXgbdb0hO62GEQOV8fxrw==

strParameter = string_To_UTF8(strParameter);
k = string_To_UTF8(k);

strRequest = Encrypt("currentpage=1&pagesize=1000000&starttime=1514736000&endtime=1514822399&paystatus=", "punr8ucu");
getchar();
return 0;
}

谢大神给的C++和C# DES加解密代码的更多相关文章

  1. 求大神帮忙解决一下c#winfrom bindingNavigatorPositionItem加载直接跳转问题

    c# winfrom bindingNavigatorPositionItem控件问题加载直接跳转到相对应的行的问题

  2. 珍藏多年的学习资料300G+,赶紧免费领取,从此离大神更进一步

    将时间线拉到2014     2014年的寒冬,每天早晨六点钟,都会一个弱小的身影,从学校寝室出发,走在去实习公司的路上.经过食堂边的包子铺,他会顺手买两个包子,一杯豆浆,老板也会像往常一样热情的吆喝 ...

  3. 自己封装了一个EF的上下文类.,分享一下,顺便求大神指点

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  4. 前端自学vs跟大神系统学?你看着办

    前端自学vs跟大神系统学?你看着办 一名广告专业学生,在大三的时候对于广告行业的前景不是很看好,转而自学web前端,刚开始接触的前端语言是html(html应该不算编程语言),上手很容易,在w3csh ...

  5. 学习大神笔记之“MyBatis学习总结(二)”

    MyBatis对表的增删改查操作         主要有两种方式:基于XML实现和基于注解实现. 完整项目结构: 工具类:MyBatisUtil-------用于获取  sqlsession pack ...

  6. JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。

      JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力..   小森执行一 ...

  7. 解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........

    这...................................................................... 我也是醉了 看不太懂,大神们求解............ ...

  8. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  9. 【web前端面试题整理04】阿里一行之大神面对面

    前言 这段时间我在河南一家公司当了一段时间的前端主管,最后可耻的匿了,原因各种各样,最主要的就是不想呆在郑州了. 其实这里的同事还是很不错的,面对老总最后的挽留我不是没有动心,而是这个地方确实不太好, ...

随机推荐

  1. ISDN简记

    简介 ISDN:(Integrated Services Digital Network,综合业务数字网) 是以综合数字电话网(IDN)为基础发展演变而形成的通信网,能够提供端到端的数字连接,用来支持 ...

  2. JDBC(11)—数据库连接池

    在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...

  3. BLEU (Bilingual Evaluation Understudy)

    什么是BLEU? BLEU (Bilingual Evaluation Understudy) is an algorithm for evaluating the quality of text w ...

  4. MySQL监控全部执行过的sql语句

    MySQL监控全部执行过的sql语句 查看是否开启日志记录show variables like “general_log%” ; +——————+———-+|Variable_name|Value| ...

  5. 安装了 R2 Integration Servic 之后,SQL Server 2008 Management Studio报错

    问题产生 IM数据库服务器未安装Integration Servic,影响备份.在安装了安装了 SQL Server 2008 R2 Integration Servic 之后,SQL Server ...

  6. np.percentile获取中位数、百分位数

    给定一个递增数组a,求它的中位数. np.percentile(a,50) 中位数就是50%处的数字,也可以获得0%.100%处的数字,0%处的数字就是第一个数字,100%处的数字就是最后一个数字.1 ...

  7. SQL DCL 数据控制语句

    前言 DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库.表.字段.用户的访问权限和安全级别.主要的语句关键字包 ...

  8. NetCore指令集和

    1.查看当前目录的版本号 C:\Users\Administrator>dotnet --version 1.0.4 2.发布程式,进入到指定目录 dotnet publish 3.运行程式 # ...

  9. [k8s]k8s内容索引

    我会陆陆续续小结下. dns相关 dns策略 1.集群内 2.指定内网 subdomain 3.访问互联网 resovel.conf kube-dns架构图解及策略 nginx-ingress: DN ...

  10. idea 自动导入