RSA加密和解密使用X509certificate2(RSA Encryption and Decr

2019-09-29 20:32发布

所以,我需要的是未来:

  1. 创造发展certifiactes,得到一个客户端和一个服务器
  2. 通过从客户端编码API取回密码,并在服务器上进行解码

现在,我设法创建以下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。 我不知道我是否应该使用任何其他,但这里是所有我做的证书文件夹中的快照:

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

 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有人帮助我。

Answer 1:

你得到错误的原因是您正试图将字符串Convert.FromBase64String从实际上不是一个基地-64字符串的值。

加密数据后,应该将字节数组转换成基64字符串。 使用Convert.ToBase64String这一点。

return Convert.ToBase64String(decryptedBytes);

然后你解密行会的工作:

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



Answer 2:

这不是你可能预期确切的答案,但我写到这里,因为它太长了注释。

我想解密本身都没有问题(我发现用php加密代码的例子博客)这就是为什么我评论我是在它是解密的目标encryptedstring好奇。

我也挣扎在理解安全数月,现在我使用的对称(AES)和非对称(RSA)在一起。 理解是非常重要的,每个人都需要时间..

RSA是非对称的,单向的,这意味着加密只能通过公共密钥来完成和解密只能通过私钥来完成。 您正在使用的加密方式的私钥,似乎刚刚从解密复制。

通过灿烂的答案是正确的只是在格式条款。 你还需要了解的格式。 我们需要Convert.ToBase64String和Convert.FromBase64String中的加密和解密字节base64string,反之亦然。 然而,这base64string不只是简单的像“你好”,但“SABlAGwAbABvACAAVwBvAHIAbABkAA ==”你看这里

我好心建议使用完整的解决方案(未半一个像PHP加密)这样的博客 ,这样的加密和解密,所有都是和谐的。

而在去年,我还评论,你需要考虑如何防止黑的用户,如果加密是由客户端完成,不必只有良好的用户。

希望我的经验可以帮助了解安全是最重要的。



文章来源: RSA Encryption and Decryption with X509certificate2