2013-01-11 71 views
1

我使用這個功能,使用加密AES,因爲它看起來簡單,乾淨(googl'ed代碼)C#AES功能沒有返回預期的結果

public static string Encrypt(string toEncrypt) 
    { 
     byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // 256-AES key 
     byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); 
     RijndaelManaged rDel = new RijndaelManaged(); 
     rDel.Key = keyArray; 
     rDel.Mode = CipherMode.CBC; 
     rDel.Padding = PaddingMode.PKCS7; // better lang support 
     ICryptoTransform cTransform = rDel.CreateEncryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
     return Convert.ToBase64String(resultArray, 0, resultArray.Length); 
    } 
    public static string Decrypt(string toDecrypt) 
    { 
     byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // AES-256 key 
     byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); 
     RijndaelManaged rDel = new RijndaelManaged(); 
     rDel.Key = keyArray; 
     rDel.Mode = CipherMode.CBC; 
     rDel.Padding = PaddingMode.PKCS7; // better lang support 
     ICryptoTransform cTransform = rDel.CreateDecryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
     return UTF8Encoding.UTF8.GetString(resultArray); 
    } 

我試圖對數據進行加密/解密數據「測試垃圾」和多數民衆贊成我收到回:

YfhyS3GE/liPCaXR0cMHfQ ==

不過,我嘗試了很多的網上AES加密的相同的密鑰/短語/解密,所有的日EM正在返回

U2FsdGVkX184u0/vPgA/B0rxofp5Iuqm7hfn4 + QZAhg =

誰能居然告訴我,什麼是錯?

回答

1

「3a8114db34d5623d4fd1ee0fb0ga7a73」是十六進制編碼的128位密鑰不是UTF8編碼的256位密鑰。

這就是說簡單和乾淨並不一定意味着正確。例如,您使用的代碼使用的是隨機IV,但不包括它的有線格式,您將永遠無法解密您加密的內容。

我有剪切和粘貼式的簡單代碼示例,我儘量保持最新和審查使用使用AES加密認證:

Modern Examples of Symmetric Authenticated Encryption of a string. C#

+0

你的類是相當真棒,但並沒有解決我的問題。 我想知道這些在線加密/解密是如何工作的,因爲它們都給出了相同的結果,我試驗了10個函數,但沒有一個輸出相同的結果。 – Alexandre

+0

如果這是你的問題,你應該包括你的「大量的在線加密/解密服務」,因爲一般來說,即使你運行了兩次,一個好的aes加密實現也不會給出相同的結果,但它不應該與隨機數據區分開來。這就是爲什麼你有一個IV,爲什麼你通常將它與你的密文一起包括進來,而爲了解密它,你通常必須有一個一致的連線格式,典型的做法是把IV先添加到你的密文中,但這不是標準。 – jbtule

+0

我只是認爲他們應該是平等的,那麼你的回答是正確的,並會改變我的實施。 – Alexandre

1

首先有幾個問題與您的代碼。顯然谷歌並不總是返回最好的代碼。

  • 您正在通過UTF8編碼獲取密鑰,這很愚蠢。這將產生一個非常弱密鑰:
// 256-AES key 
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); 
  • 您正在使用CBC模式,但四不(明確)集。

然後你比較一些在線加密/解密服務,你會發現有所不同。那是因爲他們可能(希望)工作不同。

這裏最主要的是你的2種方法是匹配的,你可以對數據進行往返。但是一個好的加密會使用不同的方式來獲得Key和IV。

我不知道是什麼原因,你看到一個不同的(小)長度的加密數據,但一切由設置整個列表:密鑰長度,填充模式等

相關問題