新聞速報

        

2016年9月20日 星期二

C# 的 Rijndael、AES、AesManaged、AesCryptoServiceProvider類整理分析

最近又在搞C#的加密,說實話,CSCrypt項目的開發真讓我漲了很多知識。

我在開發CSCrypt的過程中發現一個很有趣的現象,用Rijndael類加密的時候,即使不設置CipherMode、 PaddingMode、KeySize、BlockSize,加密解密一樣能正常運作。我感覺有點奇怪,並且非常疑惑,因為我以往在網上看到別人寫的 AES加密例子,都是用Rijndael類實現的,那麼為什麼AES需要設置的屬性,到了Rijndael卻不是必須設置的呢?如果我沒有設定,那麼它默 認又是用什麼參數呢?

帶著疑問谷歌了好久都找不到我想要的答案。反而找到了微軟MSDN中的一個建議:
Rijndael 類是Aes算法的早期版本。 應使用Aes方法代替Rijndael。 更多信息,請在.NET安全博客中參見項 The Differences Between Rijndael and AES(Rijndael和AES之間的差異)。

原來C#是帶有AES類的,可以直接調用,無需非要Rijndael來實現。從.NET 3.5版本開始,C#就有AES類了,而Rijndael類在每一個版本都有。

後來我又再搜索了一下,根據我在國外網站搜索到的資料分析,我簡單將C#中的有關AES加密的類說一下。

Rijndael、AES、AesManaged、AesCryptoServiceProvider類的說明

  • Rijndael類:表示Rijndael對稱加密算法的所有實現必須從其繼承的基類。
  • Aes類:表示高級加密標準(AES)的所有實現都必須從中繼承的抽象基類。
  • AesManaged類:提供高級加密標準(AES)對稱算法的託管實現(RijndaelManaged 類與它類似,故此不談。)
  • AesCryptoServiceProvider類:使用高級加密標準(AES)算法的加密應用程序編程接口(CAPI)實現來執行對稱加密和解密。

Rijndael、AES、AesManaged、AesCryptoServiceProvider類的對比

  • Rijndael是AES的早期版本,也就是在它被選為AES那個時候的版本。
  • AES 算法實質上是具有固定塊大小和迭代計數的 Rijndael 對稱算法。
  • Rijndael的BlockSize支持128, 160, 192, 224, 256bits。
  • AES的BlockSize只能是128bits。
  • AesManaged類的功能與 RijndaelManaged 類相同,但它將塊限制為 128 位,且不允許反饋模式。
  • AesCryptoServiceProvider類符合FIPS標準,並且調用Windows加密API,使用Rsaenh.dll,並已通過NIST的CMVP驗證,而其他的類都不符合FIPS標準,也沒有通過驗證。

結論

如果你想在你的應用程式上使用標準的AES算法,建議使用AesCryptoServiceProvider類,

如果你想在你的應用程式上混用 RijndaelManged類和AesCryptoServiceProvider類,建議使用CBC模式代替CFB模式,它們的CBC模式實現是相同 的。

如果你想用RijndaelManged類實現AES,你必須將BlockSize設置為128bits,必須將feedbacksize設置為128bits,並且不能使用CFB模式。


AES 演算法
2.0:RijndaelManaged 類別 (AES又叫Rijndael)
3.5:除了原本的 RijndaelManaged 類別 還多了 AesCryptoServiceProvider 類別,這兩個類別產生的結果相同。
AES與DES這兩種加密演算法都需要KEY與IV,AES/DES類別都有以下兩種屬性,必需要依照規則丟固定長度的Bit
  • LegalBlockSizes是表示IV的容許長度,單位Bit
  • LegalKeySizes表示KEY的容許長度,單位Bit
為了方便講解,我整理出下表:
image
PS.1 Byte=8 Bit, 所以 128 Bit = 16 Byte, 256 Bit = 32 Byte
所以我們在餵KEY跟IV的時候,就會有長度限制的問題要注意

沒有留言:

張貼留言