C# 如何将受密码保护的RSA私钥导入RSACryptServiceProvider

C# 如何将受密码保护的RSA私钥导入RSACryptServiceProvider,c#,encryption,cryptography,cryptoapi,rsacryptoserviceprovider,C#,Encryption,Cryptography,Cryptoapi,Rsacryptoserviceprovider,我正在寻找与此问题相同的解决方案: 不幸的是,没有提供解决方案的实际方法,我在最后的步骤中遇到了麻烦。概述: 我有一个使用以下步骤使用CAPI创建的现有私钥: // Abbreviated for clarity. CryptAcquireContext(..., MS_ENHANCED_PROV, ...); // Generate public/private key pair CryptCreateHash(..., CALG_SHA1, ...); CryptHashData(ha

我正在寻找与此问题相同的解决方案:

不幸的是,没有提供解决方案的实际方法,我在最后的步骤中遇到了麻烦。概述:

我有一个使用以下步骤使用CAPI创建的现有私钥:

// Abbreviated for clarity.
CryptAcquireContext(..., MS_ENHANCED_PROV, ...);

// Generate public/private key pair

CryptCreateHash(..., CALG_SHA1, ...);
CryptHashData(hash, password, ...);
CryptDeriveKey(..., CALG_3DES, hash, CRYPT_EXPORTABLE, ...);
CyrptExportKey(..., derivedKey, PRIVATEKEYBLOB, ...);
我需要将此密钥导入C#rsa加密服务提供商

基于另一个问题,我知道我必须使用PasswordDerivedBytes派生密钥,然后使用派生密钥解密密钥,但我不知道如何执行这些步骤

我有以下几点需要开始:

var parameters = new CspParameters
{
    ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0",
    ProviderType = 1, 
    Flags = CspProviderFlags.UseMachineKeyStore, 
    KeyContainerName = "KeyContainer"
};

var csp = new RSACryptoServiceProvider(parameters);
byte[] pwd = Encoding.ASCII.GetBytes("Password");

PasswordDeriveBytes pdb = new PasswordDeriveBytes(pwd, new byte[0], parameters);
// This line throws a CryptographicException with "Invalid flags specified."
byte[] symKey = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, new byte[8]);
如果我从CSParameters中删除KeyContainerName,那么我可以生成一个密钥,但我的印象是,我必须使用相同的Csp来派生相同的密钥


一旦我拿到钥匙,我不知道该如何使用它来解密密钥。

如果我们不知道密码保护的私钥是如何生成的,以及它现在的格式,那么这个问题很难回答。密码保护的密钥是在本机代码中使用问题顶部的CAPI内容生成的。SHA1、3DES等。是否缺少您正在寻找的特定内容?您似乎仍在使用
PasswordDeriveBytes
。我认为这是正确的,它建议不要使用这个功能
PasswordDeriveBytes
实现PBKDF1,该函数依赖于哈希函数,但它不会为包装键生成相同的输出。您应该尝试在两侧创建相同的对称包装函数。因此,可以在两侧使用PBKDF1(或PBKDF2,如果可用)或散列。一步一步地把中间结果用十六进制打印出来比较。