【问题标题】:What is RSACryptoServiceProvider doing under the hood when Encrypting using RSA?使用 RSA 加密时,RSACryptoServiceProvider 在幕后做什么?
【发布时间】:2019-10-03 23:46:46
【问题描述】:

当我深入研究 .Net 源代码时,我找不到调用 rsa.Encrypt 时实际运行的代码,可能它正在 DLL 中运行代码,因为我找不到方法被覆盖的位置

请您指出函数 rsa.Encrypt 的源代码或解释它在此处加密字节数组的作用(保持每个值 0>255)

我已经尝试深入研究 .net 源代码

https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsa.cs

我试图单步调试代码(它只是跳过而不单步进入)

我试图了解 RSA 如何加密数字,同时将它们保持在整数环内(即 0>255)

    public byte[] Encrypt(string publicKeyXML, string dataToEncript)
    {
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(publicKeyXML);
        return rsa.Encrypt(ASCIIEncoding.ASCII.GetBytes(dataToEncript), true);
    }

我希望 .net 源可以浏览到被覆盖函数的源代码

【问题讨论】:

  • 我无法理解您所说的“0>255”是什么意思。这不是标准的数学符号。你能澄清一下吗?
  • 您使用什么版本的 Visual Studio 来调试代码?这些调试说明 (referencesource.microsoft.com/setup.html) 适用于 Visual Studio 2013,但我认为它们也应该适用于更高版本的 VS。需要设置以下调试选项:仅禁用我的代码、禁用跨属性和运算符、禁用要求源文件与原始版本完全匹配、启用 .NET 框架源单步执行、启用源服务器支持
  • Visual Studio 2015

标签: c# cryptography rsa


【解决方案1】:

documentation for RSACryptoServiceProvider 清楚地列出了带有 OAEP 填充的 RSA,如PKCS#1 v2 中指定的,最新版本为PKCS#1 v2.2(链接到此后续版本中的 OAEP 规范)。然而,它没有指定用于 MGF1 的散列函数,但您可以确定它是默认的 SHA-1 函数(在这种情况下,这不是直接的安全问题)。所以我不完全确定如果算法被标准很好地定义,为什么你会尝试阅读源代码。

【讨论】:

    【解决方案2】:

    RSACryptoServiceProvider.Encrypt 只是调用 Windows CryptEncrypt,所以无论如何你都找不到答案。

    您似乎认为它在 RSA 操作期间对字节进行操作,但实际上它对位或数字进行操作,具体取决于您的想法。

    32 位整数值 253 加上 32 位整数值 5 产生 32 位值 258,但在字节级别 { FD, 00, 00, 00 } + { 05, 00, 00, 00 } = { 02, 01, 00, 00 }(小端十六进制)。该操作在数字级别或位级别比字节级别更有意义......但在字节级别上加法仍然很容易。

    如果您真的想了解发生了什么,可以单步执行BigInteger.ModPow,这是 RSA 中涉及的主要操作的托管实现。 BigInteger 类型的目的是处理没有 32 位或 64 位空间限制的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2018-08-13
      • 2012-08-03
      相关资源
      最近更新 更多