使用RSA加密时,RSACryptoServiceProvider到底在做什么?

时间:2019-10-01 17:04:05

标签: c# cryptography rsa

当我深入到.Net源代码时,我找不到调用rsa.Encrypt时实际运行的代码,也许它是在DLL中运行的代码,因为我找不到方法被覆盖的地方

请您指向rsa函数的源代码,在此处加密或说明对字节数组进行加密(保持每个值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源代码可用于覆盖函数的源代码

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

您似乎给人一种印象,它在RSA操作期间对字节进行操作,但实际上,它对位或数字进行操作,这取决于您如何考虑。

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

如果您真的想了解正在发生的事情,可以逐步进行BigInteger.ModPow,它是RSA涉及的主要操作的托管实现。 BigInteger类型的目的是使用不受32位或64位空间限制的数字。