这是我的第一篇文章,希望我没有漏掉任何重要的事情。 我正在使用C#进行一个项目,在这个项目中,我需要使用公钥/私钥加密来加密消息,然后通过SSL连接发送它。
我选择使用RSACryptoService
,因为根据文档,这是唯一用于加密数据的非对称加密方案。问题是,我遇到了很多问题。(我本来想做对称加密,但这不是我的老师要我做的,而且根据他的说法,只需确定块大小,就可以完成所有工作。) 到目前为止,还没有成功,我尝试了一些不同的方法,但现在我回到基础知识并再次尝试,这是我的当前代码:
public string[] GenerateKeysToStrings(string uniqueIdentifier)
{
string[] keys;
using (var rsa = new RSACryptoServiceProvider(4096))
{
try
{
string privateKey = rsa.ToXmlString(true);
string publicKey = rsa.ToXmlString(false);
this.pki.StoreKey(publicKey, uniqueIdentifier);
keys = new string[2];
keys[0] = privateKey;
keys[1] = publicKey;
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return keys;
}
如您所见,我生成了密钥,并通过将公钥发送到一个简单的类进行模仿PKI(公钥基础设施)并将私钥写入文件。
请注意,我还有另一种方法,它执行相同的操作但是将其存储在数组中,这只是因为我想测试和简化事情。当我按照示例所示进行时,会出现“找不到密钥”异常和有时出现加密异常,因此我想通过仅将rsa.ToXmlString
字符串作为字符串存储在数组中来简化它,但没有成功。
现在我有一个加密和解密方法,如下:
public string Encrypt(string keyString, string message)
{
string encryptedMessage;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Load the key from the specified path
var encryptKey = new XmlDocument();
encryptKey.Load(@"C:\Test\PrivateKeyInfo.xml");
rsa.FromXmlString(encryptKey.OuterXml);
//// Conver the string message to a byte array for encryption
//// var encoder = new UTF8Encoding();
ASCIIEncoding byteConverter = new ASCIIEncoding();
byte[] dataToEncrypt = byteConverter.GetBytes(message);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);
//// Convert the byte array back to a string message
encryptedMessage = byteConverter.GetString(encryptedData);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return encryptedMessage;
}
解密:
public string Decrypt(string keyString, string message)
{
string decryptedText;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Loads the keyinfo into the rsa parameters from the keyfile
/*
var privateKey = new XmlDocument();
privateKey.Load(keyString);
*/
rsa.FromXmlString(keyString);
//// Convert the text from string to byte array for decryption
ASCIIEncoding byteConverter = new ASCIIEncoding();
var encryptedBytes = byteConverter.GetBytes(message);
//// Create an aux array to store all the encrypted bytes
byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);
decryptedText = byteConverter.GetString(decryptedBytes);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return decryptedText;
}
虽然这篇文章很冗长,但我希望你能帮我解决问题,因为我已经苦思冥想了很长时间,但一直没有头绪:)
问题是,如何使用 RSA
(或任何其他公钥/私钥加密算法)加密消息。
下面是测试客户端:
public static void Main(string[] args)
{
PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
Cryptograph crypto = new Cryptograph();
string[] keys = crypto.GenerateKeysToStrings("simonlanghoff@gmail.com");
string plainText = "Hello play with me, please";
string publicKey = crypto.GetPublicKey("simonlanghoff@gmail.com");
string encryptedText = crypto.Encrypt(keys[0], plainText);
string decryptedText = crypto.Decrypt(keys[1], encryptedText);
}
正如我所提到的,字符串数组的存在是为了消除XML文档中的解析错误...
当我运行测试客户端时,如果我使用私钥加密和公钥解密,我会得到一个"密钥不存在异常",如果我反过来做,我会得到一个坏数据异常。
如果你知道任何好的指南,或者可以告诉我如何在字符串消息上实现公钥/私钥加密,请帮帮我。
我感激任何帮助。