2013-02-01 112 views
2

因此,我終於發現了一些更加不可理解的實施AES加密的.Net Wcf服務與相同的加密。我與它現在的問題是,每當它會嘗試解密字符串時,它會有一個步驟中它確實一個FromBase64String轉換,這將給我一個錯誤:objective c aes 128加密.net aes

static public string DecryptString(string message, string key) 
{ 
    string output = ""; 
    Rijndael aes = new RijndaelManaged(); 

    try 
    { 
     byte[] encrypted = Convert.FromBase64String(message); 
     byte[] cipherText = GetCipherText(encrypted); 

     aes.Key = Convert.FromBase64String(key); 
     aes.Mode = CipherMode.CBC; 

     aes.IV = GetIV(encrypted); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (ICryptoTransform decryptor = aes.CreateDecryptor()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
       { 
        cs.Write(cipherText, 0, cipherText.Length); 
        cs.FlushFinalBlock(); 

        byte[] decrypted = ms.ToArray(); 
        output = Encoding.UTF8.GetString(decrypted); 
       } 
      } 
     } 
    } 

的錯誤是:

Index was outside the bounds of the array.

和它發生在

cs.FlushFinalBlock(); 

這是它產生用於消息「heythere」和「25f9e794323b453885f5181f1b624d0b」

的密鑰的加密

0suql40BUGiDoFA4SdXJAA==

這是從我的.Net加密來:

unNWQfm9RaU/HgKlDNEmoXZaTzsuBoTNsA2UvDKZhc4=

PS對於AES 128加密iPhone,這是我從拿到代碼:

AES interoperability between .Net and iPhone?

+0

iPhone代碼在哪裏?您引用的問題沒有(問題中的鏈接指向空白頁面)。我注意到的一件事是,你使用加密文本作爲IV;這幾乎肯定是錯誤的。 – Ameen

+1

另外,AES是Rijndael的「專業」版本。您需要確保設置正確的密鑰大小和填充('KeySize = 256; BlockSize = 128; Mode = CipherMode.CBC; Padding = PaddingMode.PKCS7') – Ameen

+0

@gdubs:您的代碼可能會讓某些人感到驚訝。至少在一個正確的支撐塊中完成它將有助於可讀性。 –

回答

0

你可以找到爲iPhone準備樣品和.NET here

一般而言,加密算法是通用的,應在不同的語言工作只需要確保兩種算法(即在.NET和iPhone中):

  • 使用完全相同的密鑰,以相同的方式進行存儲/傳輸(通常是base64)
  • 具有完全相同的參數,包括填充架構,操作模式(例如, CBC/ECB)
+0

這實際上是我試圖用來加密。解密是我遇到一些問題的地方,因爲我的做法與他的做法不同。 – gdubs