简体   繁体   English

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

[英]RSACryptoServiceProvider initialize with own public key and private key

I'm trying to initialize RSACryptoServiceProvider with my own public and private keys. 我正在尝试使用自己的公钥和私钥初始化RSACryptoServiceProvider。

As far as I could research, the way to do this is to call the constructor with 据我所知,这样做的方法是调用构造函数

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);

cspParams as shown above. cspParams如上所示。 However, when I look at the msdn example on the use of it: http://msdn.microsoft.com/en-us/library/ca5htw4f.aspx 但是,当我查看使用它的msdn示例时: http//msdn.microsoft.com/en-us/library/ca5htw4f.aspx

I don't see any place where they set the private or public keys. 我没有看到他们设置私钥或公钥的任何地方。 Only using a KeyContainer. 仅使用KeyContainer。 When I create an RSACryptoServiceProvider without a cspParam, then it is by default set to only use a Public key. 当我创建一个没有cspParam的RSACryptoServiceProvider时,它默认设置为仅使用公钥。 I notice this when I check the PublicOnly variable on the class itself and it is a read only variable. 当我检查类本身的PublicOnly变量并且它是一个只读变量时,我注意到了这一点。

My question is how do I initialize this class and then set my own private and public keys. 我的问题是如何初始化这个类,然后设置我自己的私钥和公钥。 The server will be using the private key and the client will have the public key. 服务器将使用私钥,客户端将拥有公钥。

What I found out is that creating an RSAParameter object and setting the .Exponent and .Modulus parameters on it as the public and private variables respectively. 我发现的是创建一个RSAParameter对象并将.Exponent和.Modulus参数分别设置为公共和私有变量。

But I'm getting a "Missing Private Key" error since I believe the RSACryptoServiceProvider isn't initialized with the correct constructor. 但是我收到了“Missing Private Key”错误,因为我认为RSACryptoServiceProvider没有使用正确的构造函数进行初始化。

Below is some of my code. 下面是我的一些代码。 Don't worry about BigInteger class, it's just an experiment. 不要担心BigInteger类,它只是一个实验。 Even if I use it or not, I get the same error. 即使我使用它,我也会得到同样的错误。

//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("19579160939939334264971282204525611731944172893619019759209712156289528980860378672033164235760825723282900348193871051950190013953658941960463089031452404364269503721476236241284015792700835264262839734314564696723261501877759107784604657504350348081273959965406686529089170062268136253938904906635532824296510859016002105655690559115059267476786307037941751235763572931501055146976797606538425089134251611194500570922973015579287289778637105402129208324300035518642730384616767241853993887666288072512402523498267733725021939287517009966986976768028023180137546958580922532786773172365428677544232641888174470601681", 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);
//}

The fields are horribly named and it is confusing you. 这些字段名字很可怕,令你感到困惑。 The Exponent field is really the public exponent for a public key. Exponent字段实际上是公钥的公共指数。 The private exponent for a private key is the D field. 私钥的私有指数是D字段。

It is not your fault that MSDN documentation sucks. MSDN文档很糟糕,这不是你的错。

You have to convert base 64: 你必须转换基数64:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM