RSA密钥加密和解密问题

时间:2018-04-01 12:19:59

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

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

| id   |   date     |ranking  |
==============================
| 119  | 2018-03-01 | 1       |
| 119  | 2018-04-01 | 2       |
| 119  | 2018-05-01 | 3       |
| 120  | 2018-02-01 | 1       |
| 120  | 2018-03-01 | 2       |
--------------------------------

和解密

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;
    }
  }
}

希望这就够了。请建议

1 个答案:

答案 0 :(得分:1)

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

您已经获取了加密的二进制数据并将其转换为base64,但之后您将使用UTF-8获取base64数据并将其转换为二进制数,之后由于某些原因将其拆分为逗号:

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

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

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

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