gpt4 book ai didi

c# - 从 C# 到 C++ 的加密/解密

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:27 32 4
gpt4 key购买 nike

我正在开发一个使用 C# 服务器和 C++ 客户端的应用程序,许可数据在两个应用程序之间传输。出于安全原因,我显然想加密这些许可证,但我在寻找适合我的 C++ 目的的库时遇到了一些麻烦。也就是说,我已经尝试过 Crypto++ 和 CryptoAPI。 Crypto++ 看起来是一个不错的、易于使用的库,但是Crypto++ 的加密和C# 的加密的结果是不同的。 CryptoAPI 可以完成这项工作,因为它由 Microsoft 维护,但 API 令人困惑且难以理解。此外,奇怪的是,C# 会在每个运行时生成相同的加密输出,即使我没有触及 IV 的随机生成。 Crypto++ 不会这样做(输出随随机 IV 下的每个运行时而变化)。

有没有人有任何建议或指南?我对 Crypto++ 和 C# 使用 CBC 模式,所以我认为这不是问题。我目前正在使用 TripleDES 让程序首先运行。我是否应该使用不同的算法(一旦完成,我肯定会这样做)?

代码,按要求(对此感到抱歉):

public static string Encrypt(string ToEncrypt, string Key)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(Key);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(ToEncrypt);
TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();

tDes.Key = keyArray;
tDes.Mode = CipherMode.CBC;
tDes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tDes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tDes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

和解密(C++):

std::string Decrypt(std::string ToDecrypt, string Key)
{
const byte *byteKey = (byte*) Key.c_str();
CryptoPP::SecByteBlock key(CryptoPP::DES_EDE2::DEFAULT_KEYLENGTH);
key.Assign(byteKey, Key.length());
byte iv[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };

try {
std::string recovered, cipher;
CryptoPP::CBC_Mode<CryptoPP::DES_EDE2>::Decryption d;
d.SetKeyWithIV(key, key.size(), iv);

CryptoPP::StringSource(ToDecrypt, true, new CryptoPP::Base64Decoder(new CryptoPP::StringSink(cipher)));
CryptoPP::StringSource(cipher, true, new CryptoPP::StreamTransformationFilter(d, new CryptoPP::StringSink(recovered)));

std::cout << "Recovered: " << recovered << std::endl;
return recovered;
} catch (const CryptoPP::Exception &e) {
std::cout << e.what() << std::endl;
exit(1);
}
}

最佳答案

//解密Dll

extern "C"

{
__declspec(dllexport) char* Parse(LPSTR Data)
{
CString decryptString; //ccrpyt is a c++ encryption and decryption library
CCrypt crypt;
char* sUser = new char[200];
char* sURL = new char[200];
strcpy(sUser, Data);
CString sEncryptedUser= crypt.DecryptStrFromHex(sUser);
strcpy(sURL, sEncryptedUser.GetBuffer());
return sURL ;
}
}


{
__declspec(dllexport) char* Parse(LPSTR Data)
{
CString decryptString; //ccrpyt is a c++ encryption and decryption library
CCrypt crypt;
char* sUser = new char[200];
char* sURL = new char[200];
strcpy(sUser, Data);
CString sEncryptedUser= crypt.DecryptStrFromHex(sUser);
strcpy(sURL, sEncryptedUser.GetBuffer());
return sURL ;
}
}

我在 C# 中称它为...

public static extern IntPtr Parse([MarshalAs(UnmanagedType.LPStr)] string s1);
string s = Request.QueryString.Get("U");
IntPtr i;
{
i = Parse(s);
}
string jj =Marshal.PtrToStringAnsi(i);
Response.Write(jj);
}

关于c# - 从 C# 到 C++ 的加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795733/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com