我正在研究利用C#服務器和C++客戶端的應用程序,並在兩個應用程序之間傳輸許可數據。爲了安全起見,我顯然希望對這些許可證進行加密,但是我在查找符合C++目標的庫時遇到了一些問題。也就是說,我已經嘗試了Crypto ++和CryptoAPI。 Crypto ++似乎是一個不錯的易用庫,但Crypto ++的加密和C#加密的結果是不同的。 CryptoAPI可以完成這項工作,因爲它由微軟維護,但是API很混亂,難以理解。另外,奇怪的是,C#在每個運行時都會生成相同的加密輸出,即使我沒有觸及IV的隨機生成。 Crypto ++不會這樣做(輸出隨隨機IV下的每個運行時間而變化)。從C#到C++的加密/解密
有沒有人有任何建議或指引?我爲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);
}
}
我們需要代碼和輸出來查看IV部分出錯的位置。 – 2012-01-09 22:00:16
只需添加代碼。對於那個很抱歉。 – jForshee 2012-01-09 22:42:55
@jForshee:你的'Decrypt'函數不使用它傳遞的'Key'參數 - 這是故意的嗎? – ildjarn 2012-01-09 23:14:27