如何在RSAParameters上设置公钥和私钥以用于RSACryptoServiceProvider?
我在线阅读了一些教程,并生成了公钥和私钥,但是如何将它们设置为在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 $网站复制海峡的加密/解密function:
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参数的等效字节数组。
第二个问题是你对“公共”和“私人”键的解释。 公钥不是(仅)模数,私钥不是指数。 公钥由模数和 (公共)指数( RSAParameters
类型的Exponent
属性,私钥是模数和私有指数( RSAParameters
类型的D
属性))组成。但是,为了成为用于解密,导入RSACryptoServiceProvider
的RSAParameters
也必须设置DP
, DQ
和InverseQ
属性(虽然我没有对此进行测试,但也可能需要P
和Q
)。
同样,在不知道公钥/私钥中使用的编码的情况下,我无法提供有关如何提取适当值以填充RSAParameters
的必要属性的任何进一步细节。