2

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

我正在我自己的 RSA 实现和 Microsoft 的实现之间构建一个互操作性模块。就我而言,我在 P & Q 值之间建立了一个小的随机方差,因此对于 1024 位密钥,我最终可能会得到一个值为 506 位和另一个 518 的值。在纯粹的实验基础上,如果我将方差锁定为 0(即P & Q 值的大小相等)- 事情按应有的方式工作,我一旦将大小变量设为 Microsoft RSA 对象,就会在导入过程中响应“错误数据”。

我正在寻找 Microsoft 强制执行相同密钥大小的确认,因此如果有人对此有任何信息,请发布

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

对于那些关心的人,请看这里:http: //blogs.msdn.com/b/alejacma/archive/2007/12/03/rsacryptoserviceprovider-fails-when-used-with-asp-net.aspx

4

2 回答 2

1

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(resp. q-1)必须不超过模数的一半。

从技术上讲,私有指数d有无限多个可能的值,对于exponent1and也是如此,exponent2因为在数学上重要的是dp-1q-1的值;如果它们最终具有较低的汉明权重,则建议接受稍长的私有指数部分,因为这会带来一些性能优势。底线:上述格式不会让你这样做。

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

  • 第一个素数 ( p , aka prime1) 的数值必须大于第二个素数 ( q , aka prime2) 的数值。
  • 公共指数(此处编码在rsapubkey字段中)必须适合 32 位整数(无符号)。

因此,根据RSA 标准,有许多名义上有效的 RSA 密钥对,但 Microsoft RSA CSP 代码无法处理这些密钥对。值得注意的是关于公共指数大小的最后一个约束:这意味着该约束比 CSP 更通用;如果您设置一个 SSL 服务器,其中服务器的公钥(在其证书中)有一个不适合 32 位的公共指数,那么 Internet Explorer 将无法连接到它。

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

于 2011-10-20T11:48:01.427 回答
0

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

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

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

于 2011-10-19T15:14:26.540 回答