2015-12-02 295 views
1

所以,我解密解碼的base64 aes字符串有問題。這可能嗎?我寫了一個小型控制檯程序來解決這個問題,但沒有運氣。這是我的例子:使用RijndaelManged類的AES加密:Baes64編碼和解碼aes加密字符串

enter image description here

如圖所示,我已經成功轉換的base64後面的AES加密的字符串,但是當我嘗試解密它,我得到更多的垃圾。如果代碼段需要讓我。謝謝大家的幫助:) UPDATE:代碼片段解密方法

static void Main(string[] args) 
    { 
     string plainText; 
     string decrypted; 
     string decryptedFromB64EncodedDecoded; 
     string fromBase64ToEncryptedText; 
     string encryptedText; 
     string encryptedTextBase64; 
     byte[] encryptedBytes; 

     byte[] encryptedBytes2; 
     byte[] encryptedBytesBase64; 

     RijndaelManaged crypto = new RijndaelManaged(); 

     UTF8Encoding UTF = new UTF8Encoding(); 

     Console.WriteLine("Please put in the text to be encrypted."); 
     plainText = Console.ReadLine(); 

     try 
     { 
      encryptedBytes = encrypt(plainText, crypto.Key, crypto.IV); 
      encryptedText = Encoding.ASCII.GetString(encryptedBytes); 
      //encryptedBytes2 = Encoding.ASCII.GetBytes(encryptedText); 

      encryptedTextBase64 = toBase64String(encryptedText); 
      encryptedBytesBase64 = fromBase64String(encryptedTextBase64); 

      fromBase64ToEncryptedText = Encoding.ASCII.GetString(encryptedBytesBase64); 

      encryptedBytes2 = Encoding.ASCII.GetBytes(fromBase64ToEncryptedText); 

      decrypted = decrypt(encryptedBytes, crypto.Key, crypto.IV); 
      decryptedFromB64EncodedDecoded = decrypt(encryptedBytes2, crypto.Key, crypto.IV); 

      Console.WriteLine("Start: {0}", plainText); 
      Console.WriteLine("Encrypted: {0}", encryptedText); 
      Console.WriteLine("Encrypted Base64: {0}", encryptedTextBase64); 
      Console.WriteLine("From Base64 To AES Encypted Text: {0}", fromBase64ToEncryptedText); 
      Console.WriteLine("Decrypted: {0}", decrypted); 

      Console.WriteLine("Decrypted From Encode and then Decode Base64 Text: {0}", decryptedFromB64EncodedDecoded); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception: {0}", ex.Message); 
     } 

     Console.ReadLine(); 
    } 

public static string decrypt (byte[] textToDecrypt, byte[] key, byte[] IV) 
    { 
     RijndaelManaged crypto = new RijndaelManaged(); 
     MemoryStream stream = new MemoryStream(textToDecrypt) ; 
     ICryptoTransform decryptor = null; 
     CryptoStream cryptoStream = null; 
     StreamReader readStream = null; 

     string text = string.Empty; 

     try 
     { 
      crypto.Key = key; 
      crypto.IV = IV; 
      crypto.Padding = PaddingMode.None; 

      decryptor = crypto.CreateDecryptor(crypto.Key, crypto.IV); 
      cryptoStream = new CryptoStream(stream, decryptor, CryptoStreamMode.Read); 
      //cryptoStream.Read(textToDecrypt, 0, textToDecrypt.Length); 
      readStream = new StreamReader(cryptoStream); 
      text = readStream.ReadToEnd(); 
      cryptoStream.Close(); 

      byte[] decodedValue = stream.ToArray(); 

      return text; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      if (crypto != null) 
      { 
       crypto.Clear(); 
      } 
      stream.Flush(); 
      stream.Close(); 
     } 
    } 

public static byte[] encrypt(string text, byte[] key, byte[] IV) 
    { 
     RijndaelManaged crypto = null; 
     MemoryStream stream = null; 

     //ICryptoTransform is used to perform the actual decryption vs encryption, hash function are a version crypto transforms 
     ICryptoTransform encryptor = null; 
     //CryptoStream allows for encrption in memory 
     CryptoStream cryptoStream = null; 

     UTF8Encoding byteTransform = new UTF8Encoding(); 

     byte[] bytes = byteTransform.GetBytes(text); 

     try 
     { 
      crypto = new RijndaelManaged(); 
      crypto.Key = key; 
      crypto.IV = IV; 

      stream = new MemoryStream(); 

      encryptor = crypto.CreateEncryptor(crypto.Key, crypto.IV); 
      cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write); 
      cryptoStream.Write(bytes, 0, bytes.Length); 

     } 
     catch (Exception) 
     { 

      throw; 
     } 
     finally 
     { 
      if (crypto != null) 
      { 
       crypto.Clear(); 
      } 
      cryptoStream.Close(); 
     } 

     return stream.ToArray(); 
    } 

public static string toBase64String(string value) 
    { 
     UTF8Encoding UTF = new UTF8Encoding(); 
     byte[] myarray = UTF.GetBytes(value); 
     return Convert.ToBase64String(myarray); 
    } 

    public static byte[] fromBase64String(string mystring) 
    { 
     //UTF8Encoding UTF = new UTF8Encoding(); 
     //byte[] myarray = UTF.GetBytes(value); 
     return Convert.FromBase64String(mystring); 
    } 
+0

我看不到您的加密方法。我錯過了什麼嗎? – MutantNinjaCodeMonkey

+0

讓我張貼真正的快速,意外地留下了大聲笑。 –

+0

很確定你的問題在編碼中。你可以發佈toBase64String和fromBase64String方法。 –

回答

1

我不知道你是如何解密,但您解密之前,您應前基64字符串轉換爲字節數組發送它到解密。

byte[] encryptedStringAsBytes = Convert.FromBase64String(base64EncodedEncryptedValue); 

然後通過字節數組可以通過MemoryStream傳遞給CryptoStream。

UPDATE

我相信這個問題是你如何設置你的流

  using (RijndaelManaged rijndaelManaged = new RijndaelManaged()) 
      { 
       rijndaelManaged.Padding = paddingMode; 
       rijndaelManaged.Key  = key; 
       rijndaelManaged.IV  = initVector; 

       MemoryStream memoryStream = null; 
       try 
       { 
        memoryStream = new MemoryStream(valueToDecrypt); 
        using (ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor()) 
        { 
         using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Read)) 
         { 
          using (StreamReader streamReader = new StreamReader(cryptoStream)) 
          { 
           return streamReader.ReadToEnd();      
          } 
         } 
        } 
       } 
       finally 
       { 
        if (memoryStream != null) 
         memoryStream.Dispose(); 
       } 
      }  

更新2

這是你應該如何基本上執行的步驟。

要加密

  1. 使用Encoding.GetBytes(stringToEncrypt)
  2. 通過字節[]到加密API(經由存儲器流等)
  3. 得到編碼您純文本字符串的從加密的字節流和編碼的結果爲Base64

解密(做反向)

  1. 轉換編碼的字符串使用Convert.FromBase64String(base64EncodedEncryptedValue)字節的base64
  2. 通該字節數組到您的解密函數上述
+1

嘿:)這正是我正在做的。我將更新解密代碼,以便您可以查看它,我可能會做錯誤的哈哈。 –

+0

好酷!我會給你一槍!我會告訴你,如果這很快就能在這裏工作。 –

+0

在真實性,我喜歡返回一個SecureString.or byte [] – Jim

1

嘗試:基於您的評論

encryptedBytes2 = Encoding.ASCII.GetBytes(encryptedText); 

。字節就是那個字節,所以爲了解密密文,你需要撤消任何編碼或你已經完成的一系列編碼。

如果你真的想從加密字節 - > Base64String - > ASCII字符串 - >然後解密那個ASCII字符串?你需要爲base64解碼ASCII字符串然後使用

Encoding.ASCII.GetBytes(yourdecodedstring); 

注意該基地64解碼是不一樣的使用Convert.FromBase84String轉換該字符串爲字節。

+0

這將破壞我試圖完成的目的,即將AES編碼爲base64字符串,然後將base64解碼爲AES加密字符串,然後將其解密。 –

+0

So Encrypted Bytes - > Base64String - > ASCII string - >然後解密那個ASCII字符串? –

+1

是的:)但無論什麼原因,當我得到解密字符串的最後一步給返回垃圾字符串,而不是「富酒吧」。 –