簡體   English   中英

如何有效地恢復 RSA 中的公鑰或私鑰?

[英]How to efficiently restore public or private key in RSA?

我發現很多帖子如何通過 RSACryptoServiceProvider 做到這一點,但他們都錯過了一件可能是次要的事情。 即使它是次要的,我想問是否有人知道如何有效地做到這一點。

當您實例化 RSACryptoServiceProvider 時,它會生成一個私鑰/公鑰。 object 上有一些導入方法允許您導入另一個密鑰。 以 ImportCspBlob 為例。 困擾我的是,即使我不需要它們,它也會在執行構造函數時生成私鑰/公鑰對。 無論如何,我計划導入另一個密鑰。 問題是如何在執行構造函數時避免生成密鑰或將我的密鑰傳遞給構造函數,從而有效地避免生成新的對?

另外,我知道密鑰容器並閱讀了有關如何使用它將 CspParameters 傳遞給構造函數的信息,但在我的情況下,我將公鑰傳遞給另一個應用程序或系統,這意味着容器無論如何都是空的。

RSACryptoServiceProvider構造函數確實根據簡短的構造函數文檔創建了一個密鑰對:

使用隨機密鑰對初始化RSACryptoServiceProvider class 的新實例。

但是,如果您單擊構造函數,然后閱讀完整的文檔,那么即使在示例代碼下方,您也會得到這句話:

此構造函數不會立即生成新的公鑰/私鑰對。 如果沒有通過ImportParameters方法或任何其他密鑰導入方法加載密鑰,則在需要密鑰之前,會按需創建一個 1024 位的臨時密鑰。

換句話說,它使用密鑰對字段的惰性實例化。

所以你的假設是錯誤的,但你有一個很大的借口來犯錯:.NET 加密類的文檔仍然沒有達到應有的水平。

該帳戶的文檔尚不清楚,但看起來密鑰對實際上是在構造函數中創建的。 這是構造函數

    [SecurityCritical]
private RSACryptoServiceProvider(
  int dwKeySize,
  CspParameters parameters,
  bool useDefaultKeySize)
{
  if (dwKeySize < 0)
    throw new ArgumentOutOfRangeException(nameof (dwKeySize), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  this._parameters = Utils.SaveCspParameters(CspAlgorithmType.Rsa, parameters, RSACryptoServiceProvider.s_UseMachineKeyStore, ref this._randomKeyContainer);
  this.LegalKeySizesValue = new KeySizes[1]
  {
    new KeySizes(384, 16384, 8)
  };
  this._dwKeySize = useDefaultKeySize ? 1024 : dwKeySize;
  if (this._randomKeyContainer && !Environment.GetCompatibilityFlag(CompatibilityFlag.EagerlyGenerateRandomAsymmKeys))
    return;
  this.GetKeyPair();
}

最后它調用GetKeyPair。 最終它調用 GetKeyPairHelper 並在該方法的中間我看到

      int userKey = Utils._GetUserKey(safeProvHandle, parameters.KeyNumber, ref invalidHandle);
  if (userKey != 0)
  {
    if ((parameters.Flags & CspProviderFlags.UseExistingKey) != CspProviderFlags.NoFlags || userKey != -2146893811)
      throw new CryptographicException(userKey);
    Utils._GenerateKey(safeProvHandle, parameters.KeyNumber, parameters.Flags, dwKeySize, ref invalidHandle);
  }

注意 Utils._GenerateKey。 這讓我相信至少在某些情況下它會生成密鑰。 我不清楚在我的特定條件下執行哪個代碼塊,我的示例可能完全脫離上下文。 我試圖了解我必須如何編寫代碼以保證密鑰對不在構造函數中創建。

此文檔https://docs.microsoft.com/en-us/dotnet/standard/security/generating-keys-for-encryption-and-decryption還說

每當創建非對稱算法 class 的新實例時,都會生成公鑰/私鑰對。

所以,一切都相當混亂。

暫無
暫無

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

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