2012-06-14 33 views
1

我試圖加密一個字符串,將其保存在一個文件中,然後從文件中讀取字符串並對其進行解密。但是當我運行代碼時,我只是得到「解密數據的長度是無效的」錯誤:/通過調試我試圖找出由於某種原因,字節數組(數組^字節)長度爲12當我嘗試解密字符串,當我加密字符串時它的長度爲8。從字符串加載字節數組無法正常工作?

這裏是加密字符串代碼:

String^ EncryptS(){ 
String^ DecryptedS; 
MD5CryptoServiceProvider^ md5Crypt = gcnew MD5CryptoServiceProvider(); 
UTF8Encoding^ utf8Crypt = gcnew UTF8Encoding(); 
TripleDESCryptoServiceProvider^ crypt = gcnew TripleDESCryptoServiceProvider(); 
crypt->Key = md5Crypt->ComputeHash(utf8Crypt->GetBytes("123")); 
crypt->Mode = CipherMode::ECB; 
crypt->Padding = PaddingMode::PKCS7; 
ICryptoTransform^ transCrypt = crypt->CreateEncryptor();  
DecryptedS = utf8Crypt->GetString(transCrypt->TransformFinalBlock(utf8Crypt->GetBytes(form1::passwordTextBox->Text), 0, utf8Crypt->GetBytes(form1::passwordTextBox->Text)->Length)); 
return DecryptedS; } 

這裏是解密

String^ decryptS(String^ encryptedS){ 
String^ decryptedS; 
array<Byte>^ bytes; 
MD5CryptoServiceProvider^ md5Crypt = gcnew MD5CryptoServiceProvider(); 
UTF8Encoding^ utf8Crypt = gcnew UTF8Encoding(); 
UTF8Encoding^ utf8ToByte = gcnew UTF8Encoding(); 
TripleDESCryptoServiceProvider^ crypt = gcnew TripleDESCryptoServiceProvider(); 
crypt->Key = md5Crypt->ComputeHash(utf8Crypt->GetBytes("123")); 
crypt->Mode = CipherMode::ECB; 
crypt->Padding = PaddingMode::PKCS7; 
ICryptoTransform^ transCrypt = crypt->CreateDecryptor(); 
bytes = utf8ToByte->GetBytes(encryptedS); 
return decryptedS = utf8Crypt->GetString(transCrypt->TransformFinalBlock(bytes, 0, bytes->Length)); } 

我一直試圖以小時爲單位,現在解決這個問題的串碼,但沒有成功,幫助將不勝感激:)

對不起,我的英語不好。

回答

4

您試圖使用UTF-8將任意字節數組轉換爲字符串。這就像試圖加載一些隨機文本文件,就好像它是一個JPEG文件一樣,並希望它成爲一個有效的圖像。

當字節數組真的是用該編碼進行文本編碼時,您應該只使用Encoding.GetString(byte[])

如果要表示「任意」二進制數據(通常是壓縮或加密的數據),則應根據需要使用base64或十六進制。 (Convert.ToBase64StringConvert.FromBase64String是你的朋友。)

+0

謝謝:)它的工作! – HalfEvil

相關問題