如何在RSAParameters上设置公钥和私钥以用于RSACryptoServiceProvider?

时间:2014-02-10 19:16:34

标签: c# encryption rsa

我在线阅读了一些教程,并生成了公钥和私钥,但是如何将它们设置为在C#中使用?这就是我所拥有的:

        string publicKey = "...";
        string privateKey = "....";
        UnicodeEncoding ByteConverter = new UnicodeEncoding();
        byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
        byte[] encryptedData;
        byte[] decryptedData;
        string decrptedStr = "";
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) {
            RSAParameters myRSAParameters = RSA.ExportParameters(true);
            myRSAParameters.Modulus = ByteConverter.GetBytes(publicKey);
            myRSAParameters.Exponent = ByteConverter.GetBytes(privateKey);
            encryptedData = RSAEncrypt(dataToEncrypt, myRSAParameters, false);
            decryptedData = RSADecrypt(encryptedData, myRSAParameters, false);
            decrptedStr = ByteConverter.GetString(decryptedData);
        }

以下是我从M $网站复制海峡的加密/解密功能:

    static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) {
        try {
            byte[] encryptedData;
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) {
                RSA.ImportParameters(RSAKeyInfo);
                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        } catch (CryptographicException e) {
            Console.WriteLine(e.Message);

            return null;
        }

    }

    static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) {
        try {
            byte[] decryptedData;
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) {
                RSA.ImportParameters(RSAKeyInfo);
                decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
            }
            return decryptedData;
        } catch (CryptographicException e) {
            Console.WriteLine(e.ToString());

            return null;
        }

    }

1 个答案:

答案 0 :(得分:3)

这里有很多问题。您没有指明公钥/私钥的编码,但我可以确定无论编码如何,只需通过ByteConverter.GetBytes(...)获取与Unicode编码字符串等效的字节就行不通。这些应该是数字RSA参数的等效字节数组。

第二个问题是您对“公共”和“私人”键的解释。公钥不是(仅)模数,私钥不是指数。公钥由模数(公共)指数(Exponent类型的RSAParameters属性组成,私钥是模数和私有指数(D类型的RSAParameters属性)。但是,为了用于解密,导入RSAParameters的{​​{1}}也必须设置RSACryptoServiceProviderDPDQ属性(InverseQP也可能需要,但我没有对此进行测试。)

同样,在不知道公钥/私钥中使用的编码的情况下,我无法提供有关如何提取适当值以填充Q的必要属性的更多详细信息。