从C#到C+的加密/解密+; 我正在研究一个应用程序,它使用C++服务器和C++客户端,在两个应用程序之间传输许可数据。我显然想加密这些许可证,出于安全原因,但我有一些困难,找到一个库,将符合我的目的C++。也就是说,我尝试了Crypto++和CryptoAPI。Crypto++似乎是一个很好的、易于使用的库,但是Crypto++的加密和C#的加密的结果是不同的。CryptoAPI可以完成这项工作,因为它是由Microsoft维护的,但该API令人困惑且难以理解。此外,奇怪的是,C#在每个运行时生成相同的加密输出,即使我不涉及IV的随机生成。Crypto++不会这样做(在随机IV下,每个运行时的输出都会发生变化)
有人有什么建议或指导方针吗?我对Crypto++和C#都使用CBC模式,所以我认为这不是问题。我目前正在使用TripleDES使程序首先工作。我是否应该使用不同的算法(一旦完成,我肯定会使用) 代码,按要求(对此表示抱歉): 和解密(C++):从C#到C+的加密/解密+; 我正在研究一个应用程序,它使用C++服务器和C++客户端,在两个应用程序之间传输许可数据。我显然想加密这些许可证,出于安全原因,但我有一些困难,找到一个库,将符合我的目的C++。也就是说,我尝试了Crypto++和CryptoAPI。Crypto++似乎是一个很好的、易于使用的库,但是Crypto++的加密和C#的加密的结果是不同的。CryptoAPI可以完成这项工作,因为它是由Microsoft维护的,但该API令人困惑且难以理解。此外,奇怪的是,C#在每个运行时生成相同的加密输出,即使我不涉及IV的随机生成。Crypto++不会这样做(在随机IV下,每个运行时的输出都会发生变化),c#,c++,encryption,cryptography,C#,C++,Encryption,Cryptography,有人有什么建议或指导方针吗?我对Crypto++和C#都使用CBC模式,所以我认为这不是问题。我目前正在使用TripleDES使程序首先工作。我是否应该使用不同的算法(一旦完成,我肯定会使用) 代码,按要求(对此表示抱歉): 和解密(C++): std::字符串解密(std::字符串加密,字符串密钥) { 常量byte*byteKey=(byte*)Key.c_str(); CryptoPP::SecByteBlock密钥(CryptoPP::DES_EDE2::DEFAULT_KEYLENGT
std::字符串解密(std::字符串加密,字符串密钥)
{
常量byte*byteKey=(byte*)Key.c_str();
CryptoPP::SecByteBlock密钥(CryptoPP::DES_EDE2::DEFAULT_KEYLENGTH);
key.Assign(byteKey,key.length());
字节iv[8]={1,1,1,1,1,1,1,1};
试一试{
恢复的字符串,密码;
CryptoPP::CBC_模式::解密d;
d、 SetKeyWithIV(key,key.size(),iv);
CryptoPP::StringSource(ToDecrypt,true,新的CryptoPP::Base64解码器(新的CryptoPP::StringSink(密码));
CryptoPP::StringSource(cipher,true,new CryptoPP::StreamTransformationFilter(d,new CryptoPP::StringSink(已恢复));
std::cout//解密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#
as
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);
}
//解密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#
as
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);
}
我们需要代码和输出来查看IV部分出错的地方。只是添加了代码。对此我们深表歉意。@jForshee:YourDecrypt
函数没有使用它传递的Key
参数——这是故意的吗?为什么IV设置为所有零?有人能检查CryptoPP中的默认填充是否为PKCS#5和/或PKCS#7吗?Prepend使用随机IV加密密文是解决IV传输问题的正常方法(IV始终与密码块大小相同)。使用ECB模式对于非相关随机数据以外的任何其他数据都是不安全的。此外,不执行完整性检查的客户端/服务器协议(例如,由于填充预言符)也是不安全的-您可能还想在密文上创建一个(H)MAC,并在解密之前验证(密码的最后一块)数据。我们需要代码和输出来查看IV部分出错的地方。只是添加了代码。对此很抱歉。@jForshee:YourDecrypt
函数没有使用它传递的Key
参数——这是故意的吗?为什么IV设置为所有零?有人能检查CryptoPP中的默认填充是否为PKCS#5和/或PKCS#7吗?P使用随机IV重复密文是解决IV传输问题的正常方法(IV始终与密码块大小相同)。使用ECB模式对于非相关随机数据以外的任何其他数据都是不安全的。此外,不执行完整性检查的客户端/服务器协议也是不安全的(例如,由于填充的预言),你也希望在密文上创建(H)MAC,并在解密(最后一个数据块)之前验证它。你能详细说明我如何在C++中加密并在C++中解密它吗?你能详细说明我如何在C++中加密并在C++中解密它吗?