【问题标题】:RSA Key encrypt and decrypt issueRSA密钥加密和解密问题
【发布时间】:2018-09-10 21:15:36
【问题描述】:

我正在尝试使用公钥向客户端的 api 发送加密响应,并尝试使用我的私钥解密来自客户端的响应。 当我尝试解密消息时,它显示“密钥不存在”。以下是我正在使用的代码。

public string Encryption(string strText, string publickey)
{
  var data = Encoding.UTF8.GetBytes(strText);
  using (var rsa = new RSACryptoServiceProvider(2048))
  {
    try
    {
      var key = "<RSAKeyValue><Modulus>" + publickey.Replace('-', '+').Replace(' ', '+') + "</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
      rsa.FromXmlString(key);
      var encryptedData = rsa.Encrypt(data, true);
      var base64Encrypted = Convert.ToBase64String(encryptedData);
      return base64Encrypted;
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    finally
    {
      rsa.PersistKeyInCsp = false;
    }
  }
}

用于解密

  public string Decrypt(string data, string privateKey)
{
  CspParameters cp = new CspParameters();
  cp.KeyContainerName = "MyKeyContainerName";
  var rsa = new RSACryptoServiceProvider(cp);
  var dataArray = data.Split(new char[] { ',' });
  byte[] dataByte = new byte[dataArray.Length];
  dataByte = Encoding.UTF8.GetBytes(data);
  var encoder = new UnicodeEncoding();
  var key = "<RSAKeyValue><Modulus>" + privateKey + "</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
  rsa.FromXmlString(key);
  var decryptedByte = rsa.Decrypt(dataByte, false);
  return encoder.GetString(decryptedByte);
}

希望这已经足够了。请指教

【问题讨论】:

  • 我猜你需要在Decrypt-方法中指定密钥大小,比如var rsa = new RSACryptoServiceProvider(2048, cp);
  • &lt;Modulus&gt;privateKey&lt;/Modulus&gt; 没有做任何有用的事情,也不是正确的方法。您的错误是“我没有私钥”
  • @MartinBackasch 感谢您的回复。我试了一下,还是一样的错误。

标签: c# encryption rsa public-key-encryption private-key


【解决方案1】:

您正在尝试执行一系列转换,但您并没有在每个方向上做相反的事情。

您已获取加密的二进制数据并将其转换为 base64,但随后您将获取 base64 数据并使用 UTF-8 将其转换回二进制,在使用逗号将其拆分后出于某种原因:

var dataArray = data.Split(new char[] { ',' });
byte[] dataByte = new byte[dataArray.Length];
dataByte = Encoding.UTF8.GetBytes(data);

要反转 base64 编码的最后一个操作,您应该执行 base64 解码:

byte[] dataByte = Convert.FromBase64String(data);

这可能不是唯一的错误,但这是我发现的第一个

【讨论】:

  • 嗨。感谢您的回复。当我尝试上述更改时,我收到错误消息“Base-64 char 数组或字符串的长度无效”。这是因为我从服务器获得的数据只是“SE”。您还可以建议我配置 RSACryptoServiceProvider,将密钥作为字符串而不是 XML。我用谷歌搜索了很多,但无法对它有一个明确的想法。
  • @VivekJeevaKumar:一次只关注一件事是值得的——让我们先解决解密问题,然后你可以提出一个关于如何配置加密提供程序的单独问题。 (我现在将把它从我的回答中删除。)所以,如果你从服务器获取的只是“SE”的数据,那不是你的 Encryption 方法返回的值,因为它是不是完整的 base64 字符串。您需要查看Encryption 返回的内容,以及为什么您没有将这些数据发送给您的客户。我还建议尝试构建一个只是调用Encryption 然后Decrypt 的控制台应用程序。删除服务器部分。
  • 谢谢。所以这就是现在的流程。我将数据发送到客户端 API(加密)。客户端 API 将向我发送响应(我的通话结果),我必须使用私钥对其进行解密。来自客户端 API 的响应不受我控制。
  • @VivekJeevaKumar:再次,我强烈建议您首先在一个非常非常简单的情况下进行加密和解密 - 只是一个控制台应用程序,您可以在其中调用 string encrypted = Encryption("Hello world", publicKey); string decrypted = Decrypt(encrypted, privateKey);。一旦你让这部分工作,你可以研究它如何与服务器集成。 直到你已经让那部分工作,你将很难理解大局中的问题。
  • 谢谢,我先试试看。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 2012-05-08
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多