我在线阅读了一些教程,并生成了公钥和私钥,但是如何将它们设置为在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;
}
}
答案 0 :(得分:3)
这里有很多问题。您没有指明公钥/私钥的编码,但我可以确定无论编码如何,只需通过ByteConverter.GetBytes(...)
获取与Unicode编码字符串等效的字节就行不通。这些应该是数字RSA参数的等效字节数组。
第二个问题是您对“公共”和“私人”键的解释。公钥不是(仅)模数,私钥不是指数。公钥由模数和(公共)指数(Exponent
类型的RSAParameters
属性组成,私钥是模数和私有指数(D
类型的RSAParameters
属性)。但是,为了用于解密,导入RSAParameters
的{{1}}也必须设置RSACryptoServiceProvider
,DP
和DQ
属性(InverseQ
和P
也可能需要,但我没有对此进行测试。)
同样,在不知道公钥/私钥中使用的编码的情况下,我无法提供有关如何提取适当值以填充Q
的必要属性的更多详细信息。