从C#到C++的加密/解密
Encryption/Decryption from C# to C++
我正在开发一个使用C#服务器和C++客户端的应用程序,许可数据在这两个应用程序之间传输。出于安全原因,我显然想加密这些许可证,但我在找到一个适合我C++用途的库时遇到了一些困难。也就是说,我已经尝试了Crypto++和CryptoAPI。Crypto++看起来是一个很好用的库,但Crypto++的加密和C#的加密结果不同。CryptoAPI可以完成这项工作,因为它由微软维护,但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);
}
}
//Decryption 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);
}
相关文章:
- POCO C++加密/解密
- 异或字符串加密/解密输出错误
- 简单仿射密码加密解密
- QT:AES-256-CBC 根据 PHP 代码在C++中加密/解密
- AES加密/解密接收所有明文
- 牡丹AES CBC PKCS7加密解密
- 加密/解密字节数组加密++
- 使用EVP_*进行加密/解密
- 使用 rsa 和 Windows 加密 API 加密/解密字符串和文件
- 使用 <wincrypt.h 加密解密期间丢失字符>
- RSA 加密/解密 Polarssl C++.
- 简单C++加密 - 解密库
- 在Qt中使用博坦加密大文件时如何获得加密/解密进度
- AES-128加密/解密
- C++RSA使用XML密钥进行加密/解密
- 无法使用英特尔 AES-NI 示例库以 32 字节块大小加密/解密
- 程序集asm x86加密/解密程序
- Mupdf加密解密问题
- 如何使用RSA/AES加密/解密较大的文件
- AES CBC 加密/解密仅解密前 16 个字节