如何更改 RSACryptoServiceProvider 的 CSP 参数

Posted

技术标签:

【中文标题】如何更改 RSACryptoServiceProvider 的 CSP 参数【英文标题】:How to change CSP parameter of RSACryptoServiceProvider 【发布时间】:2012-07-28 09:01:55 【问题描述】:

我正在使用 SignedXML 类进行 rsa-sha256 xml 签名。但问题是我需要更改 CSP 以支持 sha256。

这就是我选择证书的方式,

public X509Certificate2 GetCertificateFromStore()
        
            X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            st.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection col = st.Certificates.Find(X509FindType.FindByTimeValid, (object)DateTime.Now, false);

            X509Certificate2 x509Certificate =null;
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificate", "Select single certificate to sign", X509SelectionFlag.SingleSelection);
            if (sel.Count > 0)
            
                X509Certificate2Enumerator en = sel.GetEnumerator();
                en.MoveNext();
                x509Certificate = en.Current;
            
            st.Close();
            //x509Certificate.s
            return x509Certificate;
        

这就是我尝试更改 CSP 参数的方式。

byte[] privateKeyBlob;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa = cert.PrivateKey as RSACryptoServiceProvider;
            try
            
                privateKeyBlob = rsa.ExportCspBlob(true);
            
            catch
            
                throw new ApplicationException("Private key fails to export");
            
            // To use the RSA-SHA256 the CryptoAPI needs to select a special CSP: Microsoft Enhanced RSA and AES Cryptographic Provider
            // By reinstantiating a CSP of type 24 we ensure that we get the right CSP.
            CspParameters cp = new CspParameters(24);
            rsa = new RSACryptoServiceProvider(cp);
            rsa.ImportCspBlob(privateKeyBlob);


            signer.SigningKey = rsa;
            signer.KeyInfo = getKeyInfo(signer, cert);

问题是我正在使用 USB 设备令牌,我怀疑私钥不可导出。导出时抛出错误“Key not valid for use in specified state.”。

任何人都可以帮助如何做到这一点?

【问题讨论】:

哪一行抛出异常? 这一行 privateKeyBlob = rsa.ExportCspBlob(true); ***.com/q/10673146/589259 有什么帮助吗? 异常是因为rsa.CspKeyContainerInfo.Exportable为false,所以无法导出私钥 【参考方案1】:

如果有人对我的解决方案感兴趣,我最终会使用另一个新版本的 3rd 方 CSP。我使用的 CSP 版本是旧版本,我切换到新版本。现在签名正在工作。感谢您的帮助。

【讨论】:

以上是关于如何更改 RSACryptoServiceProvider 的 CSP 参数的主要内容,如果未能解决你的问题,请参考以下文章

更改模式时如何更改导航阴影颜色?

如何更改分区ID为AF?

更改标签文本时如何更改标签颜色

如何更改环境的字体大小?

如何使用 sqitch postgresql 验证更改列数据类型更改?

如何更改列表框项目的文本?