2012-01-09 144 views
1

我正在研究利用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); 
    } 
} 
+2

我們需要代碼和輸出來查看IV部分出錯的位置。 – 2012-01-09 22:00:16

+0

只需添加代碼。對於那個很抱歉。 – jForshee 2012-01-09 22:42:55

+0

@jForshee:你的'Decrypt'函數不使用它傳遞的'Key'參數 - 這是故意的嗎? – ildjarn 2012-01-09 23:14:27

回答

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); 
     } 
+0

您能否詳細說明如何在C#中進行加密並在C++中對其進行解密? – 2016-02-11 05:25:42