2010-11-16 26 views
0

我已經發現了幾個答案在PHP中加密和解密在C#中,但至今一直未能逆轉這一過程......如何在C#中使用AES進行加密,以便我可以用PHP解密?

的背景我想:

在C#: AES加密文件的內容。 將數據(可能通過POST通過POST)上載到服務器。

在PHP: 接收並保存文件。

而在PHP(稍後): 解密文件。

我特別想在使用SSL/TLS之外加密它(儘管我可能也要這樣做),因爲我需要知道該文件在存儲在服務器上時仍然是加密的(並且可解密!)。

在C#加密我使用:

Rijndael RijndaelAlg = Rijndael.Create(); 
RijndaelAlg.KeySize = 128; 
RijndaelAlg.Mode = CipherMode.CBC; 
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), 
             CryptoStreamMode.Read); 

和PHP解密:

mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv); 
+3

你能解釋一下你在哪裏遇到問題,或者你的問題是什麼? – ZoFreX 2010-11-16 09:33:48

+0

谷歌搜索PHP的AES出現了http://www.phpaes.com/雖然我不能擔保它的工作原理,因爲我從來沒有使用它。雖然可能對你有用。另外,mhash擴展支持許多加密方法,但AES不在其中。如果你被允許使用除AES以外的加密方法,那麼你最好的選擇是可能選擇一個既存在於C#中也存在於mhash擴展中的方案。 – GordonM 2010-11-16 11:48:18

+1

你能爲我們建立一個測試案例嗎?在C#中加密一個簡單的字符串。然後,用PHP中的當前AES實現加密相同的字符串併發布。發佈您的密鑰以及。我可以與我的實現進行比較,並試圖找出哪一個正在工作,哪個不是。 – Brad 2010-11-16 15:11:29

回答

0

你使用同時安裝了相同的模式?即你是否同時使用CBC(而不是ECB)。如果你不明白我剛剛說過的話,那麼放下評論,我會詳細解釋,因爲它有相當大的安全影響。

+0

嗨,是的,我認爲我是,在C#中進行加密我正在使用:Rijndael RijndaelAlg = Rijndael.Create(); RijndaelAlg.KeySize = 128; RijndaelAlg.Mode = CipherMode.CBC; CryptoStream cStream = new CryptoStream(fStream,RijndaelAlg.CreateEncryptor(Key,IV),CryptoStreamMode.Read); 並在PHP中解密:mcrypt_cbc(MCRYPT_RIJNDAEL_128,$ key,$ buffer,MCRYPT_DECRYPT,$ iv); – Tim 2010-11-23 12:34:07

1

一般它只取決於選擇兩側正確的選項:

  • 明文字符格式

    如何明文字符的位串編碼

  • Padding

    明文如何墊是塊大小

  • 密鑰長度的整數倍

    必須如果有選擇

  • Key derivation

    商定

    如何創建要使用的位串f或關鍵

  • 模式

    的加密模式使用

  • Storage format

    其中我們如何存儲的密文

請參閱here了很多關於這些東西的信息。特別是填充似乎是大多數互操作性問題的根源,因爲默認情況下,PHP的mcrypt使用NULL -padding,並且沒有內置的任何其他填充模式支持。 .NET甚至沒有提供使用NULL -padding的選項(因爲它在加密二進制數據時可能會導致問題)。

1

我知道這是前一陣子問過的,但我想我會爲他人發佈我的解決方案。我在PHP和C#中編寫了一個快速代碼示例,可以讓您對這兩種方式進行加密/解密。我在獲得雙方的設置方面遇到了一些問題。在填充的差異會讓它解密的一種方式,但不是其他

https://github.com/dchymko/.NET--PHP-encryption

希望幫助一些人。

相關問題