Asp.net Microsoft RSA CSP密钥大小

Asp.net Microsoft RSA CSP密钥大小,asp.net,cryptography,keystore,cryptoapi,rsacryptoserviceprovider,Asp.net,Cryptography,Keystore,Cryptoapi,Rsacryptoserviceprovider,从我所看到的,微软的RSA CSP总是生成相同位长的伪素数。因此,如果密钥大小为1024,那么P和Q值似乎(?)保证为每个512位?有没有人确切知道事实是否如此 我正在自己的RSA实现和Microsoft的实现之间构建一个互操作性模块。在我的例子中,我在P&Q值之间建立了一个小的随机方差,因此对于1024位键,我可以得到一个值为506位,另一个为518位。在纯粹的实验基础上,如果我将方差锁定为0(即P&Q值大小相等)——事情按其应有的方式运行,我会在导入过程中使大小变量Microsoft RSA

从我所看到的,微软的RSA CSP总是生成相同位长的伪素数。因此,如果密钥大小为1024,那么P和Q值似乎(?)保证为每个512位?有没有人确切知道事实是否如此

我正在自己的RSA实现和Microsoft的实现之间构建一个互操作性模块。在我的例子中,我在P&Q值之间建立了一个小的随机方差,因此对于1024位键,我可以得到一个值为506位,另一个为518位。在纯粹的实验基础上,如果我将方差锁定为0(即P&Q值大小相等)——事情按其应有的方式运行,我会在导入过程中使大小变量Microsoft RSA object响应“坏数据”

我正在寻找一个确认,微软强制执行相同的密钥大小,所以如果任何人有任何关于它的信息,请张贴

在有人有机会问我为什么必须实现自己的RSA提供程序之前:CryptoAPI在多线程环境中发挥不好,它在CryptoServiceProvider调用上锁定机器密钥库;这意味着如果从多个线程访问,“未找到文件”(相当神秘)错误


对于那些关心的人,请看这里:

我自己的工作/实验,做的(托管)RSA实现和单元测试表明,Microsoft实现在导入RSA参数值时需要特定的
字节[]
大小

当人们使用BigInteger转换参数时,这也是一个常见的互操作性问题(存在一些这样的问题),因为它们通常比MS预期的要小一些(例如,少1个字节),并且需要0填充


因此,我很确定您可以填充较小的值以使MS接受它,但您可能无法使其接受较大的值。

Microsoft的RSA CSP生成并使用私钥,它可以按所述格式导出和导入私钥,如下所示:

BLOBHEADER blobheader;
RSAPUBKEY rsapubkey;
BYTE modulus[rsapubkey.bitlen/8];
BYTE prime1[rsapubkey.bitlen/16];
BYTE prime2[rsapubkey.bitlen/16];
BYTE exponent1[rsapubkey.bitlen/16];
BYTE exponent2[rsapubkey.bitlen/16];
BYTE coefficient[rsapubkey.bitlen/16];
BYTE privateExponent[rsapubkey.bitlen/8];
因此,CSP可以处理(特别是生成)的私钥必须具有以下属性:

  • 模数长度(以位为单位)必须是16的倍数
  • 每个基本因子的长度不得超过模量长度的一半
  • 专用指数不得大于模数
  • 专用指数,约化模p-1(分别为q-1)不得超过模的一半
从技术上讲,私有指数d有无限多个可能的值,对于
exponent1
exponent2
也是如此,因为数学上最重要的是d模p-1和q-1的值;有人建议接受稍长的私有指数部分,如果它们最终的值较低,因为这将带来一些性能优势。底线:上述格式不允许您这样做

密钥必须为Microsoft代码所接受的其他特征(但在上述描述中未直接报告):

  • 第一个素数(p,aka
    prime1
    )的数值必须大于第二个素数(q,aka
    prime2
    )的数值
  • 公共指数(此处编码在
    rsapubkey
    字段中)必须适合32位整数(无符号)
因此,有许多RSA密钥对根据名义上有效,但不能由Microsoft RSA CSP代码处理。值得注意的是关于公共指数大小的最后一个约束:这意味着约束比CSP更一般;如果您设置的SSL服务器的公钥(在其证书中)具有不适合32位的公共指数,则Internet Explorer将无法连接到该服务器


因此,在实践中,如果生成RSA密钥对,则必须确保它们符合上述规则。别担心:据我们所知,这些规则不会降低安全性。

谢谢你的回答——我不是在使用大整数,而是(非常!)经过大量优化和修改的IntX类()。我遇到的最大的互操作性问题是关于Big/Little-Endian的,微软在不可预测的地方做了一些奇怪的事情,比如颠倒字节顺序。我试图弄清楚MSFT到底在最小大小/跳过大小方面做了什么(如果您有9位密钥,我的实现将给您2个字节——有些实现将给您4个字节),MSFT期望的是什么。。。谁知道呢。微软所期望的很多东西都可以追溯到CryptoAPI(看看API,结构…)。还可以看看Mono的单元测试。如果您希望实现与MS one之间的最大互操作性,您会发现您的实现应该涵盖很多关键情况。关于这一点,请快速更新:我已经通过RSACryptServiceProvider运行了多次迭代来生成密钥--每次迭代都会产生相同的密钥大小。是的,如果需要,MS将使用0-pad,并且永远不会使用比所需的多一点(双关语),即P和Q总是有位大小/2。我可以发誓,我在一些RSA文章中看到了大致相同的大小。你是对的,这也解释了为什么他们定义了一组预定义的“合法密钥大小”。很好的帖子——我会把规则放进去,看看会发生什么。很好地抓住了P>Q的要求——你知道它是从哪里来的吗?至于E——我把它锁定在65537,这是通过平方性能进行指数运算的最低汉明权重(好吧,不是1)。这使得素数搜索变得更长一些,因为它变成了:{p=generateTime(bitsize/2);}而((p%e)==1)当应用CRT时,首先计算m1=m^d1 mod p和m2=m^d2 mod q(模p和q的求幂)。然后将m2模p作为CRT的初始步骤。如果pq”要求