此帐户的文档不清楚,但看起来密钥对实际上是在构造函数中创建的。这是构造函数
[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 说
每当创建非对称算法类的新实例时,都会生成公钥/私钥对。
所以,一切都相当混乱。