2017-02-14 252 views
1

所以,我需要的是未来:RSA加密和解密使用X509certificate2

  1. 创造发展certifiactes,得到一个客户端和一个服务器
  2. 检索通过API,它是从客户端编码的密码和解码它在服务器上

现在,我设法创建了以下this link certifiactes。在那里的女孩一步一步地指导如何获得自签名certifiactes,把它们放在商店,等等...现在,我有问题的部分:

我设法使用此加密我的数据代码:

public static string Encrypt(string stringForEncription, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     byte[] array = Encoding.UTF8.GetBytes(stringForEncription); 
     try 
     { 
      decryptedBytes = rsaObj.Encrypt(array, false); 
      //decryptedBytes = rsaObj.Encrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to encrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

对于PathToPrivate密钥变量我正在使用我的客户ClientCert.pfx的路径。我不知道我是否应该使用任何其他,但这里是该文件夹的卡扣与所有我做的证书:现在

enter image description here

,对于解密,我使用下面的代码:

public static string DecryptEncryptedData(string Base64EncryptedData, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     try 
     { 
      decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to decrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

而且不管我尝试这样做,它给了我异常:

{"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. "} 

真的会apreciate有人帮助我。

+0

@KayLee试过了,没有工作,证明是好的,关键是有的,我认为这个问题是在转换为Base64String和Base64String –

+0

尝试测试DecryptEncryptedData(“你好”,串PathToPrivateKey);也许,同样的异常信息会根据我的经验显示出来。这意味着参数格式不正确(未正确加密)。希望这提供了一些线索。我确定这是关于byte,base64string,decryptedplainstring的格式。仔细分析一些像MSDN这样的示例博客,并不难。 –

+0

我将在明天上午回顾我的代码后再回来。这是深夜。 –

回答

0

你得到错误的原因是你试图从Convert.FromBase64String的字符串中得到一个实际上不是base64字符串的值。

加密数据后,应该将字节数组转换为base-64字符串。 为此使用Convert.ToBase64String

return Convert.ToBase64String(decryptedBytes); 

然后你解密行会的工作:

decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData),FALSE);

+0

Convert.ToBase64String(stringForEncription);返回字符串,而不是byte [],有什么建议吗? –

+0

好的,明白了你的意思,我返回 Convert.ToBase64String(decryptedBytes);然后在decrtypt方法中,我得到: {“参数不正确。\ r \ n”} –

+0

在哪条线路上出现此错误? – Zesty

0

这不是您可能期望的确切答案,但我在这里写作,因为它的评论太长。

我认为解密本身没有任何问题(我已经找到你的代码的例子博客与PHP加密)这就是为什么我说我对加密字符串是解密的目标好奇。

我也在努力了解几个月的安全性,现在我一起使用对称(AES)和不对称(RSA)。了解是非常重要的,每个人都需要时间..

RSA是不对称和单向的,这意味着加密只能通过公钥完成,而解密只能通过私钥完成。 您在加密方法中使用私钥,它似乎只是从解密中复制而来。

Zesty的答案只适用于格式。您还需要了解格式。我们需要将加密和解密中的Convert.ToBase64String和Convert.FromBase64String从byte到base64string,反之亦然。然而,这base64string不只是简单的像“你好”,但 “SABlAGwAbABvACAAVwBvAHIAbABkAA ==”你看here

我好心建议使用完整的解决方案(未半一个像PHP加密)这样blog使加密和解密而且都是和谐的。

最后,我还评论说,如果加密是从客户端完成的,并且您不只有好用户,您需要考虑如何防止黑人用户。

我希望我的经验有助于理解最重要的安全。