关于DES加密的问题,请高手用C++把以下这段代码实现。

云中雁荡山 2010-08-28 08:08:44

using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
//默认密钥向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/**//// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string EncryptDES(string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}

/**//// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string DecryptDES(string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}

...全文
463 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
云中雁荡山 2010-08-29
  • 打赏
  • 举报
回复
难道没有朋友会吗?给点提示也行呀
gomoku 2010-08-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wgxss 的回复:]
微软为什么不提供给VC++调用接口呢。。。。。
[/Quote]
微软倒是有提供Crypto API并支持DES。

问题出在大部分网上的C++例子都是利用CryptHashData和CryptDeriveKey来用MD5作密码,基本没有看到直接用密码并加IV扰动的,这跟C#的DESCryptoServiceProvider处理方式很不一样。

不过C++中可以利用CryptImportKey来导入一个密码,并用CryptSetKeyParam来设置IV。
下面例子C++的结果可以用C#的方式解密:
{
byte[] bytes = { 0xf1, 0x9e, 0xfc, 0x8f, 0x6a, 0x59, 0x2d, 0xcb };
string password = "nihaoma?";
string s = DecryptDES(Convert.ToBase64String(bytes), password); //s="hello"
}

#include "stdafx.h"
#include <windows.h>
#include <atlstr.h>
#include <wincrypt.h>

const BYTE IV[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
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;

typedef struct
{
BLOBHEADER header;
DWORD cbKeySize;
BYTE rgbKeyData[8];
}KeyBlob;
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;
}

void _tmain(int argc, _TCHAR* argv[])
{
BYTE buffer[8];
int dataLength = DesEncrypt("hello", "nihaoma?", buffer, sizeof(buffer));
// dataLength = 8;
// buffer = { 0xf1, 0x9e, 0xfc, 0x8f, 0x6a, 0x59, 0x2d, 0xcb };
}

注:该C++例子中没有把二进制内容转换为Base64,C++ Base64编码网上很多。
youth 2010-08-29
  • 打赏
  • 举报
回复
等C++高手
wgxss 2010-08-28
  • 打赏
  • 举报
回复
微软为什么不提供给VC++调用接口呢。。。。。
云中雁荡山 2010-08-28
  • 打赏
  • 举报
回复
我不会C++,请高手贴出代码。谢谢!
wuyq11 2010-08-28
  • 打赏
  • 举报
回复
到C++版区问
DES加密解密
q107770540 2010-08-28
  • 打赏
  • 举报
回复
云中雁荡山 2010-08-28
  • 打赏
  • 举报
回复
我用上面这段代码实现加密,加密后的字符串用C++版本的解密方法实现解密。就是将上面两个方法用C++实现。谢谢!

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧