【问题标题】:Generate random RSA keys with RSACryptoServiceProvider使用 RSACryptoServiceProvider 生成随机 RSA 密钥
【发布时间】:2010-11-20 16:13:59
【问题描述】:

如何使用 RSACryptoServiceProvider 类生成随机 RSA 公钥和私钥 (RSAParameters)? 每次创建 RSACryptoServiceProvider 的新实例时,我都会导出相同的密钥。

谢谢

【问题讨论】:

  • 显示您的代码,不要让我们猜测。

标签: c# cryptography rsa rsacryptoserviceprovider


【解决方案1】:

我对下面的代码做了一些测试,导出的参数总是不一样:

var rsaAlgo1 = new RSACryptoServiceProvider();
var rsaAlgo2 = new RSACryptoServiceProvider();

var xml1 = rsaAlgo1.ToXmlString(true);
var xml2 = rsaAlgo2.ToXmlString(true);

if (xml1 != xml2)
{
   // it always goes here...
}

【讨论】:

  • 这段代码有效,但它是一种非常危险的风格。您调用的Create()-方法实际上是抽象RSA-class(RSACryptoServiceProvider 的超类)上的静态方法,并创建RSA-class 的默认实现的实例。在大多数系统上,这将是RSACryptoServiceProvider - 但不是全部。更好的样式是var rsa = RSA.Create()var rsa = new RSACryptoServiceProvider
  • 请注意,在实际使用中,您应该指定密钥大小(例如 2048 位),而不是使用默认构造函数。
  • 密码学中的随机性无法通过简单的比较来检查。它必须满足四个要求。看看他们cs.ucsb.edu/~koc/cren/docs/w06/rng.pdf
【解决方案2】:

使用以下代码,您永远不会得到所有相同的键

var rsa = new RSACryptoServiceProvider();
var rsaParams = rsa.ExportParameters(true);

但是您应该注意,指数键可以相同,如果经常是 65537(0x010001)

“选择一个整数 e 使得 1 RSA wiki

【讨论】: