2012-04-02 58 views
-2

的代碼,可以發現:http://pastebin.com/3Yg5bHraRijndaelManaged的無法解密

我的問題是,當我解密,然後沒有東西都回來了。沒有得到解密。

它出錯周圍線111-114地方。該CryptoStream的(csDecrypt)是空的沉綿我把數據導入到的MemoryStream(msDecrypt)

編輯 Nudier想出了一個解決方案

+1

考慮對你的樣品小4倍 - 刪除所有字符串的轉換代碼,只是有字節數組。否則發佈到codereview網站。 – 2012-04-02 17:32:35

+0

你在哪裏設置加密密鑰和初始化向量? – Steve 2012-04-02 17:40:58

+0

我已經上傳了一些更多的代碼 - 謝謝你阿列克謝Levenkov,好主意 – 2012-04-02 19:27:54

回答

1
//Function for encrypting propose 
static string SymmetricEncryption(string str, byte[] key, byte[] IV) 
{ 

MemoryStream ms = new MemoryStream(); 

try 
{ 

//---creates a new instance of the RijndaelManaged class--- 
RijndaelManaged RMCrypto = new RijndaelManaged(); 

//---creates a new instance of the CryptoStream class--- 
CryptoStream cryptStream =new CryptoStream(ms, RMCrypto.CreateEncryptor(key, IV), 

CryptoStreamMode.Write); 

StreamWriter sWriter = new StreamWriter(cryptStream); 

//---encrypting the string--- 
sWriter.Write(str); 

sWriter.Close(); 

cryptStream.Close(); 

//---return the encrypted data as a string--- 
return System.Convert.ToBase64String(ms.ToArray()); 

} 
catch (Exception ex) 

{ 
Console.WriteLine(ex.ToString()); 

return (String.Empty); 
} 

} 


//Function for Decrypting propose 
static string SymmetricDecryption(string str, byte[] key, byte[] IV) 
{ 

try 

{ 

//---converts the encrypted string into a byte array--- 
byte[] b = System.Convert.FromBase64String(str); 

//---converts the byte array into a memory stream for decryption--- 
MemoryStream ms = new MemoryStream(b); 

//---creates a new instance of the RijndaelManaged class--- 
RijndaelManaged RMCrypto = new RijndaelManaged(); 

//---creates a new instance of the CryptoStream class--- 
CryptoStream cryptStream = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, IV), 

CryptoStreamMode.Read); 

//---decrypting the stream--- 
StreamReader sReader = new StreamReader(cryptStream); 

//---converts the decrypted stream into a string--- 
String s = sReader.ReadToEnd(); 

sReader.Close(); 

return s; 

} 
catch (Exception ex) 
{ 

Console.WriteLine(ex.ToString()); 

return String.Empty; 

} 

} 



//Main function execute the functions 
RijndaelManaged RMCrypto = new RijndaelManaged(); 

//---generate key--- 
RMCrypto.GenerateKey(); 

byte[] key = RMCrypto.Key; 

Console.WriteLine(「Key : 「 + System.Convert.ToBase64String(key)); 

//---generate IV--- 
RMCrypto.GenerateIV(); 

byte[] IV = RMCrypto.IV; 
Console.WriteLine(「IV : 「 + System.Convert.ToBase64String(IV)); 

//---encrypt the string--- 
string cipherText = SymmetricEncryption(「This is a test string.」, key, IV); 

Console.WriteLine(「Ciphertext: 「 + cipherText); 

//---decrypt the string--- 
Console.WriteLine(「Original string: 「 + SymmetricDecryption(cipherText, key, IV)); 
+2

這到底是什麼呢? – 2012-04-03 00:06:32

+0

謝謝你nudier,它正在工作。 我已經重構代碼,以適應我的課:[鏈接](http://pastebin.com/gugiNNTn)。 RMCrypto.GenerateKey();和RMCrypto.GenerateIV();沒有必要。 我真的不知道在哪裏的區別是在之前我的代碼和代碼了,但它的工作原理。 謝謝 – 2012-04-03 06:17:14

0

記得設置加密和解密以及DE IV密鑰(初始化向量)

+0

我已經上傳所有的代碼 - 見編輯 – 2012-04-02 19:27:29

+0

檢查這個環節,http://pastebin.com/E5U3v7G4 – 2012-04-02 20:28:27

0
 public AesData GetAesData() 
    { 

     //Before assigned the key and IV you have to generate it first this way. 

     _rijndaelObj.GenerateKey(); 

     _rijndaelObj.GenerateIV(); 


     string key = Encoding.ASCII.GetString(_rijndaelObj.Key); 
     string iv = Encoding.ASCII.GetString(_rijndaelObj.IV); 
     return new AesData(key, iv); 
    } 
+0

的按鍵默認情況下創建一個新的生成時RijndaelManaged的對象 – 2012-04-02 20:04:39