帮忙把c#代码转换成c++代码

yuehuaqishi 2008-02-20 03:13:51
谢谢了,哪位兄弟帮忙把这个转换成vc++.net2003的代码,谢谢了。

兄弟我现在是书到用时方很少!


using System;
using CAPICOM;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.IO;

namespace DecrypterHelper
{
/// <summary>
/// DecryptHelper客户端数据解密类
/// </summary>
public class DecryptHelper
{
public DecryptHelper(){}

/// <summary>
/// 解密byte[]类型的数据
/// </summary>
/// <param name="dataToDecrypt">需要解密的byte[]数据</param>
/// <param name="iv">对称加密的iv值</param>
/// <param name="salt">对称加密的salt值</param>
/// <param name="certHashValue">证书缩略图的哈希值</param>
/// <returns></returns>
public static byte[] DecryptData(byte[] dataToDecrypt,byte[] iv,byte[] salt,string certHashValue)
{
ICertificate2 certificateByHashValue = GetCertificateByHashValue(certHashValue);
byte[] buffer = DecryptKeyData(iv, certificateByHashValue);
byte[] buffer2 = DecryptKeyData(salt, certificateByHashValue);
SymmetricAlgorithm sam = CreateRijndael(buffer, buffer2);
return DecryptSymmmetricData(dataToDecrypt, sam);
}

public static void DecryptKey(byte[] encryptediv,byte[] encryptedsalt,string certhash,out byte[] decryptediv,out byte[] decryptesalt)
{
ICertificate2 x509cert=GetCertificateByHashValue(certhash);
decryptediv=DecryptKeyData(encryptediv,x509cert);
decryptesalt=DecryptKeyData(encryptedsalt,x509cert);
}

private const int keylength=16;

/// <summary>
/// 加密文件随机数生成
/// </summary>
private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();
/// <summary>
/// 生成指定长度的随机Byte数组
/// </summary>
/// <param name="count">Byte数组长度</param>
/// <returns>随机Byte数组</returns>

private static byte[] GenerateRandomBytes(int count)
{
byte[] bytes = new byte[count];
rand.GetBytes(bytes);
return bytes;
}
//private static byte[] //
/// <summary>
/// 创建Rijndael SymmetricAlgorithm
/// </summary>
/// <param name="password">用户密码</param>
/// <param name="salt">设置操作的密钥 salt 值</param>
/// <returns>CreateRijndael加密对象</returns>
private static SymmetricAlgorithm CreateRijndael(string password, byte[] iv,byte[] salt)
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(password,salt,"SHA256",1000);
SymmetricAlgorithm rij =Rijndael.Create();
rij.KeySize = 256;
rij.Key = pdb.GetBytes(32);
rij.Padding = PaddingMode.PKCS7;
rij.IV=iv;
return rij;
}
/// <summary>
/// 创建Rijndael SymmetricAlgorithm
/// </summary>
/// <param name="password">密码</param>
/// <param name="salt">设置操作的密钥 salt 值</param>
/// <returns>CreateRijndael加密对象</returns>
private static SymmetricAlgorithm CreateRijndael(byte[] iv, byte[] salt)
{
return CreateRijndael("",iv,salt);
}

/// <summary>
/// 解密byte[]值
/// </summary>
/// <param name="dataToEncrypt">待解密的byte[]值</param>
/// <returns>解密后的byte[]值</returns>
private static byte[] DecryptSymmmetricData(byte[] dataToDecrypt,SymmetricAlgorithm sam)
{
MemoryStream mstream=new MemoryStream();
CryptoStream cstream=new CryptoStream(mstream,sam.CreateDecryptor(),CryptoStreamMode.Write);
cstream.Write(dataToDecrypt,0,dataToDecrypt.Length);
cstream.FlushFinalBlock();
cstream.Close();
byte[] bytes=mstream.ToArray();
return bytes;
}

/// <summary>
/// 解密byte[]流
/// </summary>
/// <param name="dataToDecrypt">待解密的数据</param>
/// <returns>解密后的数据</returns>
private static byte[] DecryptKeyData(byte[] dataToDecrypt,ICertificate2 cert)
{
RSACryptoServiceProvider rsa=GetRSAProvider(cert);
byte[] bytes=rsa.Decrypt(dataToDecrypt,false);
return bytes;
}

/// <summary>
/// 获取RSACryptgrophyProvider
/// </summary>
/// <param name="rsa">返回RSA提供者容器</param>
private static RSACryptoServiceProvider GetRSAProvider(ICertificate2 cert)
{
RSACryptoServiceProvider rsa=null;

try
{
// Construct the public key
CspParameters csp = new CspParameters();
csp.KeyContainerName = cert.PrivateKey.ContainerName;
csp.ProviderName = cert.PrivateKey.ProviderName;
csp.ProviderType = Convert.ToInt32(cert.PrivateKey.ProviderType);
switch (cert.PrivateKey.KeySpec)
{
case CAPICOM_KEY_SPEC.CAPICOM_KEY_SPEC_KEYEXCHANGE:
csp.KeyNumber = 1;
break;
case CAPICOM_KEY_SPEC.CAPICOM_KEY_SPEC_SIGNATURE:
csp.KeyNumber = 2;
break;
}
if (cert.PrivateKey.IsMachineKeyset())
csp.Flags = CspProviderFlags.UseMachineKeyStore;
rsa = new RSACryptoServiceProvider(csp);
}
catch
{
throw new ArgumentException("解密容器错误");
}
return rsa;
}

/// <summary>
/// 获取ICertificate2类型的证书
/// </summary>
/// <param name="Sha1HashValue">证书的缩略图(SHA1_Hash)值</param>
/// <returns>ICertificate类型证书</returns>
private static ICertificate2 GetCertificateByHashValue(string Sha1HashValue)
{
StoreClass store=new StoreClass();
store.Open(CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE,"MY",CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
ICertificates2 certs=((ICertificates2)store.Certificates).Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_SHA1_HASH,Sha1HashValue,false);
ICertificate2 cert=(ICertificate2)certs[1];
return cert;
}
}
}
...全文
243 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
转MFC 难度比较大,还不如直接用mfc写
yuehuaqishi 2008-02-21
  • 打赏
  • 举报
回复
转成mfc就可以了哦,谢谢了
ms44 2008-02-20
  • 打赏
  • 举报
回复
有许多。NET的加密类用到。
如果你要转成VC,可能不行。
如果你要转成MANAGED C++ ,那用REFLECTOR即可。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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