2013-10-05 24 views
2

對於那些匆忙,這是不是有關有爭議Dual_EC_DRBG種植在NIST的SP800-90A內。隨機數字發生器安全:BCryptGenRandom與RNGCryptoServiceProvider

關於兩種隨機數發生器:

  1. 基於微軟BCRYPT層之一就是在他們的C API。 BCryptGenRandom遵循NIST SP800-90A的CTR_DRBG(即使用批准的分組密碼AES來創建隨機比特)。然而,目前還不清楚它是否使用硬件隨機源作爲種子(或種子的一部分)...

  2. Microsoft .NET RNGCryptoServiceProvider是基於C#的。看看.NET source code(或here),我看到它最終調用C++方法CapiNative.GenerateRandomBytes()。應該有一個P/Invoke存根用於C#=> C++轉換,但是我在框架源中的任何地方都找不到它。所以我不知道它是如何實現的。

有沒有人有關於這兩個隨機數發生器的附加信息?要麼使用HW隨機種子(要麼通過老年人的二極管噪聲,要麼使用最新的intels中的有爭議的RDRAND)。

PS:不知道它這應該是在安全,StackOverflow上或密碼...

回答

4

微軟.NET RNGCryptoServiceProvider是一個基於C#

不完全是,該管理框架類只是Windows內置的Crypto API的一個薄包裝。所有名稱以ServiceProvider結尾的System.Security.Cryptography類都是本地API的包裝器。那些名字以Managed結尾的是用純託管代碼實現的。因此,XxxServiceProvider類使用FIPS驗證的cryptogaphy,而類XxxManaged則不是。

它並不完全固定,它使用通用機制在CLR代碼中直接調用。抖動參考C++函數地址表,並直接編譯CALL機器碼指令。該機制在this answer中描述。看看實際的代碼是不可能的,它不包含在SSCLI20發行版中,並被改爲使用.NET 4中的QCall機制。

因此,斷言是不可證明的,但它很可能是RNGCryptoServiceProvider和傳遞給BCryptGenRandom()的算法提供程序使用相同的隨機數來源。在Windows中是advapi.dll中的一個未命名的導出函數,this answer給出了它使用的一個很好的總結。

如果這確實涉及到您,並且您想要可靠信息來源,那麼請不要從您的安全需求的免費Q + A網站獲得建議。致電Microsoft支持。

1

微軟RNGCryptoServiceProviderRFC 4086提到:

7.1.3。視窗CryptGenRandom

微軟對廣泛部署的Windows 操作系統的用戶推薦一般是使用與CryptAPI加密服務 提供商CryptGenRandom僞隨機數 代呼叫。這取得了對加密服務提供商庫的處理,指向緩衝區的指針,調用者可以通過該緩衝區提供熵 並且其中返回所生成的僞隨機性,並且指示需要多少個八位字節的隨機性八位組。

Windows CryptAPI加密服務提供程序爲每個用戶存儲一個種子 狀態變量。當CryptGenRandom被調用時,這是 與系統時間,系統計數器,內存狀態,空閒磁盤簇等系統和用戶數據(如進程ID,線程ID,系統時鐘,系統時間,和 散列用戶環境塊。這些數據全部輸入到SHA-1,而 輸出用於播種RC4密鑰流。該密鑰流用於產生所請求的僞隨機數據並更新用戶的種子狀態變量 。

Windows「.NET」的用戶可能會發現使用RNGCryptoServiceProvider.GetBytes方法接口更容易。

+2

1)它沒有真正描述'RNGCryptoServiceProvider'如何與本地CSPRNG相關。 2)早於Windows Vista。微軟在Vista中重寫了大部分加密代碼,例如現在他們使用AES CTR_DRBG而不是RC4。 – CodesInChaos