簡體   English   中英

如何在C#中使用AES加密,以便我可以在PHP中解密它?

[英]How can I encrypt with AES in C# so I can decrypt it in PHP?

我已經找到了PHP中的Encrypt和C#中的Decrypt的一些答案,但是到目前為止還無法撤消該過程。

背景是我想:

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

在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);

一般來說,它只取決於雙方選擇正確的選項:

  • 明文字符格式

    在位串中如何編碼明文字符

  • 填充

    如何將純文本填充為塊大小的精確倍數

  • 密鑰長度

    如果可以選擇,必須達成協議

  • 密鑰推導

    如何創建用於密鑰的位串

  • 模式

    使用哪種加密方式

  • 存儲格式

    我們如何存儲密文

在這里查看有關這些內容的大量信息。 特別是填充似乎是大多數互操作性問題的根源,因為PHP的mcrypt使用NULL默認-padding並沒有內置任何其他填充模式的支持,而如.NET甚至不提供使用的選項NULL -padding(因為在加密二進制數據時可能會引起問題)。

我知道這是在不久之前被問到的,但我想我會為別人發布我的解決方案。 我用PHP和C#編寫了一個快速的代碼示例,使您可以通過兩種方式進行加密/解密。 我有一些問題,讓雙方的設置得以解決。 填充的差異會讓它以一種方式解密,而不是另一種方式解密

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

希望能幫助一些人。

你和兩者使用相同的模式嗎? 即你是否同時使用CBC(而不是ECB)。 如果您不理解我剛才所說的內容,請發表評論,然后再詳細解釋,因為它具有相當大的安全影響。

幾個月前我遇到了類似的問題 - 我有一個必須使用AES加密的項目,我必須確保在C#和A C ++組件之間使用完全相同的算法。 我最終實現了一個共享的DLL庫,這兩個庫都基於此Codeplex文章中的AES加密包裝器使用:

http://www.codeproject.com/KB/security/WinAESwithHMAC.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM