【问题标题】:Parsing bug in RSACryptoServiceProvider.ImportParameters with zero-byte-prefix elimination?使用零字节前缀消除解析 RSACryptoServiceProvider.ImportParameters 中的错误?
【发布时间】:2010-09-28 19:19:52
【问题描述】:

我遇到了一些问题,其中使用 Security.Cryptography.RSAParameters 创建的 RSA 密钥大部分时间都只能使用 RSACryptoServiceProvider.ImportParameters

经过大量调试后,该对象的属性似乎需要非常具体的字节缓冲区大小。我的 ASN.1 解析代码消除了零字节前缀。事实上,RSAParameters 的某些字段仅在消除零字节前缀后才起作用,而其他字段在消除零字节前缀后根本不起作用。

由于正常随机化,经常有一个参数确实有更多的前导零,并导致生成的密钥无法正常工作。

这是否被视为错误?

【问题讨论】:

    标签: .net security import cryptography rsa


    【解决方案1】:

    你为什么要搞乱那些零字节?正 ASN.1 整数的正确 DER 编码可能涉及单个前导零字节。简而言之,如果整数的高位字节为 128 或更大,则必须在编码前添加前导零字节。没有那个零字节,你就有了负整数的 DER 编码。

    【讨论】:

    • (感谢您的回复)对,ASN.1 整数可以有一个前导零字节,但关键是 RSAParameters 对象显然不会删除 ASN.1 格式的数据,它需要字节非常特定大小的数组。所以我的代码必须从 DER 编码的 blob 中获取 ASN.1 数据并提取实际的数字字节(即,从 ASN.1 格式中剥离数据类型信息)并将它们作为字节数组提供给 RSAParameters。跨度>
    【解决方案2】:

    .NET 要求每个 RSA 参数的大小必须是精确大小(wrt 密钥对大小)。

    因此,有时您需要删除前导 0x00 字节(例如,如果数据来自 ASN.1,这需要前导 0 表示正数)。

    但有时您需要添加一个额外的 0x00 字节,因为这些字节表示一个(巨大的)数字,可能适合更少的字节(实际上是 1)。当解析 PEM (base64) 编码文件中的数据时,通常会删除前导 0。

    最终答案:确保为您提供预期长度(填充或移除填充)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多