2012-11-21 26 views
3

我想更多地瞭解.NET中RSA的功能和整個這個有用的帖子,這表明在默認情況下密鑰存儲在Windows中如何來: https://stackoverflow.com/a/5845191/1181412.NET RSA CreateEphemeralKey VS PersistKeyInCsp

我的問題引用下面的示例代碼。假設其意圖是僅在應用程序會話的生命週期中生成一次性密鑰。

問題1:在下面的結構,並在PersistKeyInCsp標誌需要在每次哪怕是訪問同一CspParameters對象的類內的任何地方創建的RSACryptoServiceProvider時間設置爲false?

問題2:設置CspParameters對象上的CreateEphemeralKey標誌是否取代在此示例中使用PersistKeyInCsp的需要?

Public Class RSACrypto 

    Private RSAKey As CspParameters 

    Public Sub New(KeySize As Integer) 
     MyBase.New() 
     RSAKey = New CspParameters 
     Using RSA As New RSACryptoServiceProvider(KeySize, RSAKey) 
      RSA.PersistKeyInCsp = False 
     End Using 
    End Sub 

    Public Function PublicKey() As Byte() 
     Using RSA As New RSACryptoServiceProvider(RSAKey) 
      RSA.PersistKeyInCsp = False 
      Return RSA.ExportCspBlob(False) 
     End Using 
    End Function 
End Class 
+0

您是否找到答案? – Garrann

回答

0

CreateEphemeralKey標誌被斷言爲你,如果你離開的密鑰容器名稱,如CspParameters結構null(和你不主張UseDefaultKeyContainer)。

對於使用CreateEphemeralKey(或隱式地通過null名稱)創建的密鑰,PersistKeyInCsp屬性沒有意義或效果。對於一個已命名(持久保存)的鍵,當對象獲得Disposed或Finalized時,它將導致該鍵被從磁盤中刪除。 (請注意,異常終止,關鍵就永遠也不會被刪除)

問題1:在下面的結構,並在PersistKeyInCsp標誌需要每一個的RSACryptoServiceProvider是類內的任何地方創建即使時間被設置爲false正在訪問相同的CspParameters對象?

如果鑰匙被堅持,則第一次設置PersistKeyInCsp=false並呼籲Dispose()(直接或通過using語句),或者讓鍵被垃圾收集完成,那麼後續訪問要麼失敗,或者創建一個不同的鍵(取決於UseExistingKey標誌是否被聲明)。所以,說「不,你不應該這樣做」是最正確的。

問題2:在CspParameters對象上設置CreateEphemeralKey標誌是否取代在此示例中使用PersistKeyInCsp的需要?

是的。

隱含問題3:爲什麼我的代碼不工作?

在你的構造函數,你有三種行爲之一,取決於CspParameters.KeyContainerName和系統狀態值:

  • KeyContainerName == null
    • 你創造大小KeySize的臨時密鑰。然後丟棄它。沒有人會知道你的鑰匙是什麼。
  • 命名的鍵不存在:
    • 你產生大小KeySize的一個密鑰,它保存到磁盤,並刪除了它。沒有人會知道你的鑰匙是什麼。
  • 命名密鑰確實存在:
    • 您打開密鑰對(KeySize被忽略)。然後你將其從磁盤上刪除。希望你不需要它。

在你PublicKey方法創建用1024位臨時密鑰(如果RSAKey.KeyContainerName == null)或打開現有的密鑰,或生成1024位密鑰,並將其保存在磁盤上。然後,您將CAPI blob導出爲公鑰,並且(如果短暫)丟棄該密鑰或(如果持續)將其從系統中刪除。 (1024位岬是因爲你使用沒有密鑰長度值CspParameters構造函數,所以從構造函數的KeySize值無關緊要)

什麼你可能想要的是保存不是CspParameters,但實際RSA /的RSACryptoServiceProvider對象。