【问题标题】:How do I set the public and private key on RSAParameters to use for RSACryptoServiceProvider?如何在 RSAParameters 上设置公钥和私钥以用于 RSACryptoServiceProvider?
【发布时间】:2014-02-10 19:16:33
【问题描述】:

我在线阅读了一些教程,并生成了公钥和私钥,但是如何设置它们以在 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;
        }

    }

【问题讨论】:

    标签: c# encryption rsa


    【解决方案1】:

    这里有很多问题。你没有指明你的公钥/私钥的编码,但我可以肯定的是,不管编码如何,简单地通过ByteConverter.GetBytes(...) 获取与 Unicode 编码字符串等效的字节是行不通的。这些应该是数字 RSA 参数的字节数组等价物。

    第二个问题是您对“公钥”和“私钥”的解释。公钥不是(只是)模数,私钥不是指数。公钥由模数(公共)指数(RSAParameters 类型的Exponent 属性组成,私钥是模数和私有 指数(RSAParameters 类型的D 属性)。但是,为了用于解密,导入到RSACryptoServiceProvider 中的RSAParameters 还必须具有DPDQ 和@987654330 @ 属性集(PQ 可能也需要,虽然我没有测试过)。

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

    【讨论】:

    • 说得好,铱星。拥有公有/私有指数和模数足以执行 RSA。如果您想使用中国剩余定理加速私钥运算,则其他参数很有用。
    • 这当然是旧的 - 但还有另一个可能的问题:使用 RSACryptoServiceProvider 对象的 ExportParameters 创建 myRSAParameters,结果将所有字段设置为某些值。用新数据覆盖其中的 一些 将创建一个包含不一致数据的数据集。最好创建一个新的 RSAParameters。
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2013-05-18
    • 2012-11-19
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多