【问题标题】:How to use public key in RSA encryption C# (.net standard 2.0)如何在 RSA 加密 C#(.net 标准 2.0)中使用公钥
【发布时间】:2021-04-25 23:52:00
【问题描述】:

我正在开发一个 .net 标准(.net 标准 2.0)库。

我有一个公钥,它是在服务器端创建的,我通过 api 调用收到了它。

现在我有一个要使用 RSA 算法加密的字符串。另外,我必须在加密我拥有的字符串时使用这个公钥。

我浏览了各种样本,但没有任何帮助。

试过这个RSA public key encryption in C#

但出现错误“此平台不支持操作。” .

试过this 一个,但找不到使用我从服务器收到的公钥的方法。

这是我尝试过的最新代码。我不确定如何以及在何处使用我的公钥字符串。

static public byte[] Encryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                RSA.ImportParameters(RSAKey);
                encryptedData = RSA.Encrypt(Data, DoOAEPPadding);
            }
            return encryptedData;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }
    static public byte[] Decryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
    {
        try
        {
            byte[] decryptedData;
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                RSA.ImportParameters(RSAKey);
                decryptedData = RSA.Decrypt(Data, DoOAEPPadding);
            }
            return decryptedData;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.ToString());
            return null;
        }
    }

在这里我可以看到RSAKey,但它不接受字符串输入。

任何人都可以指导我一些示例,通过这些示例我可以对我拥有的公众加密和解密一个简单的文本。

谢谢, 诺鲁尔。

【问题讨论】:

  • 我浏览了各种样本,但没有任何帮助。 不是一个有用的描述。如果这些示例对您没有帮助,为什么其他示例会有所帮助?所以请准确描述你尝试了什么以及问题是什么。除此之外,还缺少一些重要信息,例如您使用的是哪个 .NET 版本,密钥的格式是什么。
  • @Topaco 编辑了我尝试过的链接。希望这能解释我的情况。
  • 请发布您最近的代码,否则这里没有什么可修复的。仍然缺少密钥格式。
  • 贴出最近的代码,我试过了。
  • 可能的解决方案取决于密钥格式(您也可以发布相同格式的测试密钥)。只要您不指定,您可能必须自己找到解决方案。

标签: c# .net encryption rsa public-key-encryption


【解决方案1】:

您可以在下面找到完整的工作代码,该代码使用 XML 编码的 RSA 公钥加密字符串,并使用 RSA 私钥(以及 XML 编码)解密密文。密文以base64编码。这是一个在线编译器的链接,可以查看运行的代码:https://repl.it/@javacrypto/CpcCsharpRsaEncryptionOaepSha1String#main.cs

输出:

RSA 2048 encryption OAEP SHA-1 string
plaintext: The quick brown fox jumps over the lazy dog

* * * encrypt the plaintext with the RSA public key * * *
ciphertextBase64: lFZwBN5SnlqAKEYktjjTmDUyIAFA86CDIrOyPeRLVXLIManP6wTUgZ3NBSYynfgwXTmVzhPQL3wZ6kngWIgVbl1sMOSiTt6BOvop5HwEU6ejUOrhgDzuxSnA4e8txNG0X8NZ4kt1bzE42gHlbjxHG+CYawAVYECPMyZ4Jc/n7qH8McsUh3n/KUOB2h5R6DULjf2Qfl4aQHppbEeECNmpSFJFUSu3iGBI7hacHbb+1myyLteS1o3FiBuSVbG+L7h8DEokbhE5yVTwamFF+qM+/HTWeGfE+CGC6Kb8cAucP7Zoov6e+Gr7aFYMvhrWjTvApzMBu5XD0j3JzxQD9OmA8g==

* * * decrypt the ciphertext with the RSA private key * * *
ciphertextReceivedBase64: lFZwBN5SnlqAKEYktjjTmDUyIAFA86CDIrOyPeRLVXLIManP6wTUgZ3NBSYynfgwXTmVzhPQL3wZ6kngWIgVbl1sMOSiTt6BOvop5HwEU6ejUOrhgDzuxSnA4e8txNG0X8NZ4kt1bzE42gHlbjxHG+CYawAVYECPMyZ4Jc/n7qH8McsUh3n/KUOB2h5R6DULjf2Qfl4aQHppbEeECNmpSFJFUSu3iGBI7hacHbb+1myyLteS1o3FiBuSVbG+L7h8DEokbhE5yVTwamFF+qM+/HTWeGfE+CGC6Kb8cAucP7Zoov6e+Gr7aFYMvhrWjTvApzMBu5XD0j3JzxQD9OmA8g==
decryptedData: The quick brown fox jumps over the lazy dog

安全警告:代码使用硬编码的 RSA [示例] 密钥仅用于演示。该代码没有异常处理,仅用于教育目的。

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

class RsaEncryptionOaepSha1 {
    static void Main() {
    Console.WriteLine("RSA 2048 encryption OAEP SHA-1 string");
    string dataToEncryptString = "The quick brown fox jumps over the lazy dog";
    Console.WriteLine("plaintext: " + dataToEncryptString);

    // # # # usually we would load the private and public key from a file or keystore # # #
    // # # # here we use hardcoded keys for demonstration - don't do this in real programs # # #
    string filenamePrivateKeyXml = "privatekey2048.xml";
    string filenamePublicKeyXml = "publickey2048.xml";

        try {
      // encryption
        Console.WriteLine("\n* * * encrypt the plaintext with the RSA public key * * *");
        //string publicKeyLoad = loadRsaPublicKeyPem();
        // use this in production
        string publicKeyLoad = File.ReadAllText(filenamePublicKeyXml);
        byte[] dataToEncrypt = Encoding.UTF8.GetBytes(dataToEncryptString);
        string ciphertextBase64 = Base64Encoding(rsaEncryptionOaepSha1(publicKeyLoad, dataToEncrypt));
        //string ciphertextBase64 = "";
        Console.WriteLine("ciphertextBase64: " + ciphertextBase64);

        // transport the encrypted data to recipient

        // receiving the encrypted data, decryption
        Console.WriteLine("\n* * * decrypt the ciphertext with the RSA private key * * *");
        string ciphertextReceivedBase64 = ciphertextBase64;
        Console.WriteLine("ciphertextReceivedBase64: " + ciphertextReceivedBase64);
        //string privateKeyLoad = loadRsaPrivateKeyPem();
        // use this in production
        string privateKeyLoad = File.ReadAllText(filenamePrivateKeyXml);
        byte[] ciphertextReceived = Base64Decoding(ciphertextReceivedBase64);
        byte[] decryptedtextByte = rsaDecryptionOaepSha1(privateKeyLoad, ciphertextReceived);
        Console.WriteLine("decryptedData: " + Encoding.UTF8.GetString(decryptedtextByte, 0, decryptedtextByte.Length));
        }
        catch(ArgumentNullException) {
            Console.WriteLine("The data was not RSA encrypted");
        }
    }

  public static byte[] rsaEncryptionOaepSha1(string publicKeyXml, byte[] plaintext) {
    RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);
        RSAalg.PersistKeyInCsp = false;
        RSAalg.FromXmlString(publicKeyXml);
        return RSAalg.Encrypt(plaintext, true);
  }

  public static byte[] rsaDecryptionOaepSha1(string privateKeyXml, byte[] ciphertext) {
    RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);
        RSAalg.PersistKeyInCsp = false;
        RSAalg.FromXmlString(privateKeyXml);
    return RSAalg.Decrypt(ciphertext, true);
  }

  static string Base64Encoding(byte[] input) {
    return Convert.ToBase64String(input);
  }

  static byte[] Base64Decoding(String input) {
    return Convert.FromBase64String(input);
  }

  public static string loadRsaPublicKeyPem() {
    return "<RSAKeyValue><Modulus>8EmWJUZ/Osz4vXtUU2S+0M4BP9+s423gjMjoX+qP1iCnlcRcFWxthQGN2CWSMZwR/vY9V0un/nsIxhZSWOH9iKzqUtZD4jt35jqOTeJ3PCSr48JirVDNLet7hRT37Ovfu5iieMN7ZNpkjeIG/CfT/QQl7R+kO/EnTmL3QjLKQNV/HhEbHS2/44x7PPoHqSqkOvl8GW0qtL39gTLWgAe801/w5PmcQ38CKG0oT2gdJmJqIxNmAEHkatYGHcMDtXRBpOhOSdraFj6SmPyHEmLBishaq7Jm8NPPNK9QcEQ3q+ERa5M6eM72PpF93g2p5cjKgyzzfoIV09Zb/LJ2aW2gQw==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
  }

  public static string loadRsaPrivateKeyPem() {
    return "<RSAKeyValue><Modulus>8EmWJUZ/Osz4vXtUU2S+0M4BP9+s423gjMjoX+qP1iCnlcRcFWxthQGN2CWSMZwR/vY9V0un/nsIxhZSWOH9iKzqUtZD4jt35jqOTeJ3PCSr48JirVDNLet7hRT37Ovfu5iieMN7ZNpkjeIG/CfT/QQl7R+kO/EnTmL3QjLKQNV/HhEbHS2/44x7PPoHqSqkOvl8GW0qtL39gTLWgAe801/w5PmcQ38CKG0oT2gdJmJqIxNmAEHkatYGHcMDtXRBpOhOSdraFj6SmPyHEmLBishaq7Jm8NPPNK9QcEQ3q+ERa5M6eM72PpF93g2p5cjKgyzzfoIV09Zb/LJ2aW2gQw==</Modulus><Exponent>AQAB</Exponent><P>/8atV5DmNxFrxF1PODDjdJPNb9pzNrDF03TiFBZWS4Q+2JazyLGjZzhg5Vv9RJ7VcIjPAbMy2Cy5BUffEFE+8ryKVWfdpPxpPYOwHCJSw4Bqqdj0Pmp/xw928ebrnUoCzdkUqYYpRWx0T7YVRoA9RiBfQiVHhuJBSDPYJPoP34k=</P><Q>8H9wLE5L8raUn4NYYRuUVMa+1k4Q1N3XBixm5cccc/Ja4LVvrnWqmFOmfFgpVd8BcTGaPSsqfA4j/oEQp7tmjZqggVFqiM2mJ2YEv18cY/5kiDUVYR7VWSkpqVOkgiX3lK3UkIngnVMGGFnoIBlfBFF9uo02rZpC5o5zebaDIms=</Q><DP>BPXecL9Pp6u/0kwY+DcCgkVHi67J4zqka4htxgP04nwLF/o8PF0tlRfj0S7qh4UpEIimsxq9lrGvWOne6psYxG5hpGxiQQvgIqBGLxV/U2lPKEIb4oYAOmUTYnefBCrmSQW3v93pOP50dwNKAFcGWTDRiB/e9j+3EmZm/7iVzDk=</DP><DQ>rBWkAC/uLDf01Ma5AJMpahfkCZhGdupdp68x2YzFkTmDSXLJ/P15GhIQ+Lxkp2swrvwdL1OpzKaZnsxfTIXNddmEq8PEBSuRjnNzRjQaLnqjGMtTBvF3G5tWkjClb/MW2q4fgWUG8cusetQqQn2k/YQKAOh2jXXqFOstOZQc9Q0=</DQ><InverseQ>BtiIiTnpBkd6hkqJnHLh6JxBLSxUopFvbhlR37Thw1JN94i65dmtgnjwluvR/OMgzcR8e8uCH2sBn5od78vzgiDXsqITF76rJgeO639ILTA4MO3Mz+O2umrJhrkmgSk8hpRKA+5Mf9aE7dwOzHrc8hbj8J102zyYJIE6pOehrGE=</InverseQ><D>hXGYfOMFzXX/vds8HYQZpISDlSF3NmbTCdyZkIsHjndcGoSOTyeEOxV93MggxIRUSjAeKNjPVzikyr2ixdHbp4fAKnjsAjvcfnOOjBp09WW4QCi3/GCfUh0w39uhRGZKPjiqIj8NzBitN06LaoYD6MPg/CtSXiezGIlFn/Hs+MuEzNFu8PFDj9DhOFhfCgQaIgEEr+IHdnl5HuUVrwTnIBrEzZA/08Q0Gv86qQZctZWoD9hPGzeAC+RSMyGVJw6Ls8zBFf0eysB4spsu4LUom/WnZMdS1ls4eqsAX+7AdqPKBRuUVpr8FNyRM3s8pJUiGns6KFsPThtJGuH6c6KVwQ==</D></RSAKeyValue>";
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2017-07-02
    • 2013-10-15
    • 2014-06-23
    • 2021-03-14
    相关资源
    最近更新 更多