C# RSACryptServiceProvider公钥/私钥导入

C# RSACryptServiceProvider公钥/私钥导入,c#,.net,rsa,public-key-encryption,private-key,C#,.net,Rsa,Public Key Encryption,Private Key,我想通过RSACryptServiceProvider对数据进行签名和验证 为此,我需要公钥和私钥 在我的项目中,我将公钥和私钥存储在XML文件中 有一次,我生成了我的公钥和私钥 public bool SignutureCheckForVerify(string myData, byte[] SignedData) { ... RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(

我想通过RSACryptServiceProvider对数据进行签名和验证

为此,我需要公钥和私钥

在我的项目中,我将公钥和私钥存储在XML文件中

有一次,我生成了我的公钥和私钥

public bool SignutureCheckForVerify(string myData, byte[] SignedData)
    {
        ...

        RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
             RSAalg.FromXmlString(MyPublicKey());
        return RSAalg.VerifyData(Encoding.ASCII.GetBytes(myData), new   MineCryptoService(), SignedData);

       ...

    }

    private static string MyPublicKey()
    {
        return "<RSAKeyValue><Modulus>-----Pubic Key Here ----</RSAKeyValue>";
    }
我的问题是;在某个例子中,我认识到了这一点;通过crt/pem/cert等证书文件导入公钥和私钥。在那里,我存储在XML文件中

我的解决方案错了吗

第二个问题是

如果使用此方法导入密钥

GetKeyFromContainer(“MyKeyContainer”)

MyKeyContainer的私钥和公钥是静态的吗

每次运行时,我是否可以拥有相同的私钥/公钥

或者每次跑步我都有不同的按键设置?强调文字

我的解决方案错了吗

这取决于您的需求和威胁模型。
rsacyptoserviceprovider
的签名生成应显式设置为MD5或SHA-1以外的散列。你的问题不清楚这是否发生过

如果使用此方法导入密钥

GetKeyFromContainer(“MyKeyContainer”)

MyKeyContainer的私钥和公钥是静态的吗

是的,这就是使用密钥存储的一般想法

每次运行时,我是否可以拥有相同的私钥/公钥?还是每次生成签名时都应该设置不同的密钥

是的,您可以,因为您使用了足够的密钥大小,比如2048位或更高


实际上,要使解决方案安全,接收方需要信任公钥。当没有建立信任时,任何人都可以向您发送他们的公钥

我的解决方案错了吗

这取决于您的需求和威胁模型。
rsacyptoserviceprovider
的签名生成应显式设置为MD5或SHA-1以外的散列。你的问题不清楚这是否发生过

如果使用此方法导入密钥

GetKeyFromContainer(“MyKeyContainer”)

MyKeyContainer的私钥和公钥是静态的吗

是的,这就是使用密钥存储的一般想法

每次运行时,我是否可以拥有相同的私钥/公钥?还是每次生成签名时都应该设置不同的密钥

是的,您可以,因为您使用了足够的密钥大小,比如2048位或更高



实际上,要使解决方案安全,接收方需要信任公钥。当不建立信任时,任何人都可以将他们的公钥发送给您。

对于您的答案,我想了很多,那么如何在XML文件中存储密钥呢。XML中的Storege与证书文件中的Storege有什么区别。你能帮我吗?XML是微软专有的存储工具。在证书中存储公钥允许您在证书中存储其他数据。证书可以使用私钥“自签名”,也可以由证书颁发机构(如果是PGP,则为“任何人”)签名,从而允许您创建PKI。请注意,“密钥管理”这个主题非常重要。讨论所有选项和特定选项的含义超出了StackOverflow的范围。@MaartenBodewes RSACryptoServiceProvider需要算法作为参数,默认为SHA-1是什么意思?(它只支持OAEP的SHA-1,但这是加密,不是签名。)@bartonjs Right。它是通过调用
SignatureAlgorithm
返回的属性值。但是在上面的问题中,hash method参数被
new MineCryptoService()
替换,这让我很困惑,不管是什么。对于您的答案,我想了很多,那么如何在XML文件中存储密钥呢。XML中的Storege与证书文件中的Storege有什么区别。你能帮我吗?XML是微软专有的存储工具。在证书中存储公钥允许您在证书中存储其他数据。证书可以使用私钥“自签名”,也可以由证书颁发机构(如果是PGP,则为“任何人”)签名,从而允许您创建PKI。请注意,“密钥管理”这个主题非常重要。讨论所有选项和特定选项的含义超出了StackOverflow的范围。@MaartenBodewes RSACryptoServiceProvider需要算法作为参数,默认为SHA-1是什么意思?(它只支持OAEP的SHA-1,但这是加密,不是签名。)@bartonjs Right。它是通过调用
SignatureAlgorithm
返回的属性值。但在上面的问题中,hash方法参数被
new MineCryptoService()
替换,无论是什么,我都感到困惑。
  RSAalg.FromXmlString(GetPrivateKey());
   ...
  RSAalg.SignData(...)