2013-10-30 321 views
3

我必須加密一些私人領域,我發現(jbtule's)類using AESGCMAESGCM解密失敗與MAC

當我剛剛加密和解密正常工作:

string nonSecretPayload = "[email protected]!$#@#%a";       
string encryptThisStr = "CakeCat"; 
string key = "12345678912365478912365478965412"; 

var encryptAESGCM = AESGCM.SimpleEncrypt(Encoding.UTF8.GetBytes(encryptThisStr), Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(nonSecretPayload)); 

//addedJson += "c" + count + "{\"" + @Encoding.UTF8.GetString(encryptAESGCM) + "\"}"; 


var decrypyAESGCM2 = AESGCM.SimpleDecrypt(encryptAESGCM , Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(salt).Length); 

但是,當我在encryptAESGCM的byte []保存爲一個JSON文件中的字符串,然後解密字符串我就可以做一個Encoding.UTF8.GetBytes()後,失敗:

Org.BouncyCastle.Crypto.InvalidCipherTextException: mac check in GCM failed 
     at Org.BouncyCastle.Crypto.Modes.GcmBlockCipher.DoFinal(Byte[] output, Int32 
    outOff) in C:\BouncyCastle\crypto\src\crypto\modes\GCMBlockCipher.cs:line 295 
     at Encryption.AESGCM.SimpleDecrypt(Byte[] encryptedMessage, Byte[] key, I 
    nt32 nonSecretPayloadLength) 

我看到它使用MAC來檢查密文未被篡改。我所做的只是使用Encoding.UTF8.GetString(encryptAESGCM)將加密結果(byte [])作爲字符串添加到json字符串中,然後將其保存到Couchbase。當我收回存儲的字符串I Encoding.UTF8.GetBytes(encryptAESGCM),然後嘗試解密它。這會影響MAC嗎?有沒有解決的辦法?還有其他問題嗎?

+0

當解密使用的是'salt'加密時並沒有發揮作用。 – usr

+0

對不起,我截掉了代碼,錯過了將它保存到db的部分。我使用的salt(nonSecretPayload)被保存並且被檢索爲var salt。 –

回答

4

您不能將Encoding.UTF8.GetString應用於任意二進制數據。它只能解碼使用UTF-8編碼字符串的結果字節。 .net實現將默默破壞數據,而不是默認拋出異常。

您應該使用Base64編碼來代替:Convert.FromBase64StringConvert.ToBase64String

+0

謝謝!這似乎解決了這個問題。也給了我一些關於閱讀的內容。 –

+1

@ShaunGroenewald同樣,我寫的類有重載,它爲消息帶一個字符串並返回一個64位的密文。 – jbtule

+0

@jbtule謝謝,我發現了它們,並且在我再次破壞我的代碼後,它幫了很大忙。 –