Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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# Bouncy Castle需要很长时间才能生成RSA密钥对_C#_Sql_.net_Rsa_Bouncycastle - Fatal编程技术网

C# Bouncy Castle需要很长时间才能生成RSA密钥对

C# Bouncy Castle需要很长时间才能生成RSA密钥对,c#,sql,.net,rsa,bouncycastle,C#,Sql,.net,Rsa,Bouncycastle,我有一个Web API项目,在其中一个端点中,我使用Bouncy Castle库生成RSA密钥对。在做一些负载测试时,我开始得到504(超时错误),比如说1500个对我的Web API的并行请求。经过一番调查,我意识到是弹跳城堡造成的。所以现在我正在考虑用一百万个RSA密钥对预加载一个表,并在需要时从该表中获取它们。下面是我使用BC生成密钥对的代码: var r = new RsaKeyPairGenerator(); r.Init(new KeyGenerationParameters(new

我有一个Web API项目,在其中一个端点中,我使用Bouncy Castle库生成RSA密钥对。在做一些负载测试时,我开始得到504(超时错误),比如说1500个对我的Web API的并行请求。经过一番调查,我意识到是弹跳城堡造成的。所以现在我正在考虑用一百万个RSA密钥对预加载一个表,并在需要时从该表中获取它们。下面是我使用BC生成密钥对的代码:

var r = new RsaKeyPairGenerator();
r.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
var keyPair = r.GenerateKeyPair();
var publicKey = string.Empty;
using (var stream = new MemoryStream())
{
    var textWriter = new StreamWriter(stream);
    var pemWriter = new PemWriter(textWriter);
    pemWriter.WriteObject(keyPair.Public);
    pemWriter.Writer.Flush();
    stream.Position = 0;
    var sr = new StreamReader(stream);
    publicKey = sr.ReadToEnd();
    textWriter.Close();
}

var privateKey = string.Empty;
using (var stream = new MemoryStream())
{
    var textWriter = new StreamWriter(stream);
    var pemWriter = new PemWriter(textWriter);
    pemWriter.WriteObject(keyPair.Private);
    pemWriter.Writer.Flush();

    stream.Position = 0;
    var sr = new StreamReader(stream);
    privateKey = sr.ReadToEnd();
    textWriter.Close();
}

所以有两个问题,上面的代码中有没有我做错了什么(它可以正常工作,但如果我正在做的任何事情可能会导致延迟,并且可以避免)?另外,如果我使用另一种方法(用一百万个键对预加载SQL表),那么用一百万条记录填充表的最佳方法是什么?(最好使用ADO.net)

如果密钥生成器工作正常,它将使用高熵随机数生成器。这些将尝试从您的服务器收集尽可能多的“外部”随机性,一个好的生成器将暂停并可能对收集的随机性进行估计

随机性的来源(如果您没有可用的特定硬件)是用户输入、硬件事件(如网络流量和USB中断)和计时器抖动(当CPU时钟因负载而改变时,这些会改变)

在服务器上,很难收集足够的熵来生成好的密钥(由于缺少用户输入和外围设备数量减少)


因此,试图在没有特殊硬件的情况下生成大量密钥的速度很慢或质量很差


在这种情况下,最好使用硬件源(例如)。

它会变得更糟,因为建议将2048位密钥设置为1024位以上。也许可以尝试通过.Net的rsacyptoserviceprovider()->ExportParameters()进行比较,因为实现会有所不同。我将尝试看看rsacyptoserviceprovider是否有任何不同。感谢“试图在没有特殊硬件的情况下生成大量的密钥,因此要么速度慢,要么质量差。”这句话远远超出了人们的理解。在没有特殊硬件的情况下,“生成大量高质量和合理速度的RSA密钥”一点也不超出最先进的技术水平。每次都会创建一个新的SecureRandom(),并且每个密钥都将从RNGCryptoServiceProvider中以32字节的部分种子植入。也许其他人知道这是否会耗尽一些熵池。因此,根据我的发现,生成大约10k个密钥需要很长时间(大约需要25分钟),但所花费的时间不会在一段时间内增加。它总是在10毫秒到700毫秒之间(不取决于它是生成的第一个键还是循环中的最后一个键)。我在这里发布了一个单独的问题:@JamesKPolk——也许吧,但是如果你的熵少一些,那么你生成的每个键之间的相关性就会更强。我对这个描述有点过火,因为关于速度和键相关性之间权衡的决定应该仔细考虑。看看tavier的另一个问题,这里可能有一个更具体的问题:-)