// 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. 小甲鱼Python第三讲课后习题

    0.以下哪个变量的命名不正确?为什么? A:MM_520 B:_MM520_ C:520_MM D:_520MM 变量 命名:以字母.下划线.数字组成,以字母.下划线开头 1.除了使用反斜杠(\)进行 ...

  2. spring中的多线程aop方法拦截

    日常开发中,常用spring的aop机制来拦截方法,记点日志.执行结果.方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例) 一.先定义一个Aspect import org ...

  3. 使用js冒泡实现点击空白处关闭弹窗

    什么是事件冒泡? 如图:在一个对象上触发某类事件(比如单击onclick事件),这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶 ...

  4. [Asp.net core]使用ssh命令发布asp.net core项目

    命令 # 移除之前发布的包 rm -rf ./.Publish rm -rf ./Wolfy.Blog.tar.gz # 编译并发布 将发布包打包在.Publish目录下 -o "../.P ...

  5. Java+Selenium3框架设计篇5-如何实现邮件发送测试报告

    https://blog.csdn.net/u011541946/article/details/77278837 本篇继续回答网友的问题,这个主题是如何通过邮件发送测试报告.通过邮件发送测试报告,这 ...

  6. bootstrap响应式前端页面

    技术:HTML+CSS+JS+bootstrap   概述 这套代码响应式前端页面基本写完了,适合初学前端的同学,里面主要运用了HTML+CSS布局和动画,js逻辑较少,页面都是静态,未接入接口.响应 ...

  7. Effective Java 第三版—— 87. 考虑使用自定义序列化形式

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  8. Down Payment 和 Deposit的差异

    If you’re like most homeowners, purchasing a home represents the single biggest financial transactio ...

  9. django 与 mysql 勾结指南

  10. MySQL查询库和表占用的硬盘空间大小

    在mysql中有一个默认的数据表information_schema,information_schema这张数据表保存了MySQL服务器所有数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问 ...