2012-11-21 232 views
18

我需要使用AES加密數據。在研究中,我發現了AesCryptoServiceProvider課。RijndaelManaged與AesCryptoServiceProvider(AES加密)

我對加密知之甚少,我不知道初始化向量(IV)是什麼,所以我嘗試在堆棧溢出中搜索AES示例,並導致我到this question

爲什麼堆棧溢出鏈接使用RijndaelManaged類? RijndaelManagedAesCryptoServiceProvider類是否做同樣的事情?

+0

不,他們沒有做同樣的事情。請參閱http://stackoverflow.com/a/4863924/328397 – LamonteCristo

+0

可能的重複[爲什麼RijndaelManaged和AesCryptoServiceProvider返回不同的結果?](http://stackoverflow.com/questions/957388/why-are-rijndaelmanaged-and- aescryptoserviceprovider-returning-different-results) –

回答

25

AES基於Rijndael,但塊大小限制爲128位。 Rijndael支持更大範圍的塊大小,許多加密庫提供獨立的Rijndael實現以補充AES。

Rijndael算法支持128,160,192,224和256位的塊大小,但在AES標準中只規定了128位塊大小。 [Wikipedia]

您鏈接到RijndaelManaged類。 AES的等效等級是AesManaged

關於階級之間的區別:AesManaged只需使用RijndaelManaged設置爲128 AesManagedRijndaelManaged塊大小不符合FIPS和使用。如果FIPS組策略位時將拋出一個異常時。 .NET Framework 4.6.2(2016年8月)添加了AesCng類,這是一種執行AES算法的CNG版本。

An IV是一段隨機數據,其長度與塊大小相等,這是某些對稱操作模式(例如CBC模式)所要求的。通常,IV與第一個明文塊或第一個密文塊組合(XOR-ed)。這個想法是確保使用相同的密鑰加密相同的消息兩次將不會產生相同的輸出。

+0

非常感謝鄧肯。我如何指定塊大小?例如,您提到Rijndael支持更大範圍的塊大小,例如255位。這是由IV鍵的長度決定的?如果我傳遞一個16字節的密鑰,我將使用128位加密,如果我傳遞一個32字節的IV密鑰,我將使用256位加密? –

+0

我不確定 - 我沒有自己使用過課程。如果我不得不猜測,如果不是從IV長度推斷的,你可能需要手動設置'BlockSize'屬性。 –

+3

您最後一次關於差異的說法對於'AesManaged'來說是非常錯誤的。 'AesManaged'只是使用'RijndaelManaged'的塊大小設置爲128.'AesManaged'也不符合FIPS,並且如果設置了FIPS組策略標誌則會引發異常。目前在.NET中,不支持CNG版本的AES算法。 –