使用X509certificate2

时间:2017-02-14 12:51:59

标签: c# security encryption rsa x509certificate2

所以,接下来我需要的是:

  1. 为开发创建证书,为客户端创建一个证书,为服务器创建一个证书
  2. 通过从客户端编码的API检索密码并在服务器上对其进行解码
  3. 现在,我设法在this link之后创建了证书。那里的那个女孩一步一步地指示如何获得自签名证书,把它们放在店里等等......现在,我遇到问题的那部分:

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

    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. "}
    

    真的会帮助我帮助我。

2 个答案:

答案 0 :(得分:0)

您收到错误的原因是您尝试Convert.FromBase64String的字符串实际上不是base-64字符串。

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

return Convert.ToBase64String(decryptedBytes);

然后您的解密线将起作用:

  

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

答案 1 :(得分:0)

这不是你可能想到的确切答案,但我在这里写,因为它的评论太长了。

我认为解密本身没有任何问题(我已经找到了使用php加密的代码示例博客)这就是为什么我评论我对加密字符串感到好奇,这是解密的目标。

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

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

Zesty的答案仅限于格式化。您还需要了解格式。我们需要加密和解密中的Convert.ToBase64String和Convert.FromBase64String,从byte到base64string,反之亦然。但是这个base64string并不像'hello'那样简单 'sABlAGwAbABvACAAVwBvAHIAbABkAA =='如你所见here

我建议使用像blog这样的完整解决方案(不是像PHP加密这样的半个解决方案),这样加密和解密就可以和谐了。

正如我最后评论的那样,如果从客户端进行加密并且您没有良好的用户,则需要考虑如何防止黑人用户。

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