Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RSACryptoProvider为同一CSParameter ContainerName重复生成相同的密钥_C#_.net_Cryptography_Rsa - Fatal编程技术网

C# RSACryptoProvider为同一CSParameter ContainerName重复生成相同的密钥

C# RSACryptoProvider为同一CSParameter ContainerName重复生成相同的密钥,c#,.net,cryptography,rsa,C#,.net,Cryptography,Rsa,我是.NET CryptoProvider领域的新手,我有点担心我所看到的关于RSACryptoProvider重复创建相同密钥的情况。 我之所以使用容器,是因为我将密钥存储到服务器上的文件中,就像这样(我在创建之后导出CspBlob,稍后再重新导入它) 在这种情况下,ContainerName有一个硬编码的值,我通过该值引用容器。 困扰我的是,当我创建RSACryptoProvider时,通过对密钥对进行EXENT,生成的密钥值总是相同的 RSACryptoServiceProvider rs

我是.NET CryptoProvider领域的新手,我有点担心我所看到的关于RSACryptoProvider重复创建相同密钥的情况。 我之所以使用容器,是因为我将密钥存储到服务器上的文件中,就像这样(我在创建之后导出CspBlob,稍后再重新导入它)

在这种情况下,ContainerName有一个硬编码的值,我通过该值引用容器。 困扰我的是,当我创建RSACryptoProvider时,通过对密钥对进行EXENT,生成的密钥值总是相同的

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(RSAKeySize, _cp);
如果我更改容器的名称,则键会更改。创建RSACryptoProvider时,除了容器名称之外,还必须有其他一些随机性来源,对吗?否则,容器的名称将成为密码,这不是我的意图

它是容器的名称,而不是生成器的名称


如果每次都需要不同的密钥,只需创建一个新的CryptoServiceProvider,而不引用容器(=存储的密钥对)。

以下代码将删除与容器名称相关的密钥(如果存在)。 删除密钥后;您可以创建一个具有相同conatiner名称的新密钥,您将获得新的随机密钥

            CspParameters cspParams = new CspParameters();
            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            //Create a new instance of RSACryptoServiceProvider. 
            //Pass the CspParameters class to use the 
            //key in the container.
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

            //Delete the key entry in the container.
            rsa.PersistKeyInCsp = false;

            //Call Clear to release resources and delete the key from the container.
            rsa.Clear();

正确的。因此,如果我知道容器的名称,我可以在任何地方重新创建相同的密钥对?!那太糟糕了。这使容器的名称成为密码。@Bob。呃。。。否。该名称的容器存储在计算机的配置文件应用程序数据目录中。如果您在同一台计算机上按名称打开该容器,它将显示其中的密钥。如果您试图在另一台计算机上打开它,则无法获取任何内容。计算机在您第一次使用该容器时自动生成了密钥,并为您在下次需要时保持安全。正如@Henk所建议的,还有其他方法可以得到一把新钥匙。很好,找到了。这就是我所需要的。密钥的随机性附加到我的配置文件和容器名称。这对我很有用。非常感谢。
            CspParameters cspParams = new CspParameters();
            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            //Create a new instance of RSACryptoServiceProvider. 
            //Pass the CspParameters class to use the 
            //key in the container.
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

            //Delete the key entry in the container.
            rsa.PersistKeyInCsp = false;

            //Call Clear to release resources and delete the key from the container.
            rsa.Clear();