RSACryptoServiceProvider使用自己的公钥和私钥进行初始化

我正在尝试使用自己的公钥和私钥初始化RSACryptoServiceProvider。

据我所知,这样做的方法是用构造函数调用

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams); 

cspParams如上所示。 但是,当我查看使用它的msdn示例时: http : //msdn.microsoft.com/en-us/library/ca5htw4f.aspx

我没有看到他们设置私钥或公钥的任何地方。 仅使用KeyContainer。 当我创建一个没有cspParam的RSACryptoServiceProvider时,它默认设置为仅使用公钥。 当我检查类本身的PublicOnly变量并且它是一个只读变量时,我注意到了这一点。

我的问题是如何初始化这个类,然后设置我自己的私钥和公钥。 服务器将使用私钥,客户端将拥有公钥。

我发现创建一个RSAParameter对象并将.Exponent和.Modulus参数分别设置为公共变量和私有变量。

但是我收到了“Missing Private Key”错误,因为我认为RSACryptoServiceProvider没有使用正确的构造函数进行初始化。

以下是我的一些代码。 不要担心BigInteger类,它只是一个实验。 即使我使用它,我也会得到同样的错误。

 //Create a UnicodeEncoder to convert between byte array and string. UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] dataToEncrypt = ByteConverter.GetBytes(password); byte[] encryptedData; byte[] decryptedData; //RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters rsap = new RSAParameters(); BigInteger n = new BigInteger("", 10); BigInteger e = new BigInteger("65537", 10); //rsap.Modulus = ByteConverter.GetBytes(publicKey); rsap.Exponent = e.getBytes(); rsap.Modulus = n.getBytes(); /*rsap.Exponent = ByteConverter.GetBytes(publicKey); rsap.D = ByteConverter.GetBytes(publicKey); rsap.DP = ByteConverter.GetBytes(publicKey); rsap.DQ = ByteConverter.GetBytes(publicKey); rsap.P = ByteConverter.GetBytes(publicKey); rsap.Q = ByteConverter.GetBytes(publicKey); rsap.InverseQ = ByteConverter.GetBytes(publicKey);*/ using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { //RSA.PublicOnly = false; RSA.ImportParameters(rsap); Debug.Log ("PublicOnly: " + RSA.PublicOnly); Debug.Log (rsap.Modulus.Length); //Debug.Log (RSA.ToString()); //Pass the data to ENCRYPT, the public key information //(using RSACryptoServiceProvider.ExportParameters(false), //and a boolean flag specifying no OAEP padding. //encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false); encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false); Debug.Log ("encryptedData: " + encryptedData); //Display the decrypted plaintext to the console. //Debug.Log("Decrypted plaintext: " + ByteConverter.GetString("")); //Pass the data to DECRYPT, the private key information //(using RSACryptoServiceProvider.ExportParameters(true), //and a boolean flag specifying no OAEP padding. decryptedData = RSACSPSample.RSADecrypt(encryptedData, RSA.ExportParameters(true), false); } //encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false); //if (encryptedData != null) { password = ByteConverter.GetString(decryptedData); //} 

这些字段名字很可怕,令你感到困惑。 Exponent字段实际上是公钥的公共指数。 私钥的私有指数是D字段。

MSDN文档很糟糕,这不是你的错。

你必须转换基数64:

 byte[] modulusBytes = Convert.FromBase64String(modulus); byte[] exponentBytes = Convert.FromBase64String(exponent);