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

标签 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;
        }

    }

最佳答案

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

第二个问题是您对“公钥”和“私钥”的解释。公钥不是(只是)模数,私钥不是指数。公钥由模数(公共(public))指数(Exponent 类型的 RSAParameters 属性,私钥是模数和私有(private)指数( D RSAParameters类型的属性)。但是,为了解密,导入到RSAParameters中的RSACryptoServiceProvider还必须具有DPDQInverseQP679156791567915679156791567915679156791567915679915 properties( ).

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

关于c# - 如何在 RSAParameters 上设置公钥和私钥以用于 RSACryptoServiceProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685939/

相关文章:

c# - 后锐利。如何引入可序列化属性

go - 无法在golang中使用公钥加密

ios - 如何在 ios 中生成公钥/私钥对,swift

java - 为php和java实现的加密方法?

java - 求模数的互质数

c# - 如何通过反射为参数的默认值调用方法

c# - 在 UWP 中的 Rtf 和 Html 之间转换

c# - 如何删除 XML 中的节点标记

python - 对 python2 和 python3 使用相同代码的编码 + 加密 + pad 出现问题

ssl - 第三方https转发?