gpt4 book ai didi

c# - C#中大数据的RSA加密

转载 作者:太空狗 更新时间:2023-10-29 18:32:40 25 4
gpt4 key购买 nike

这是我的第一篇文章,所以希望我没有错过任何重要的事情。我正在用 C# 做一个项目,我需要使用公钥/私钥加密来加密消息,然后通过 SSL 连接发送它。

我选择使用 RSACryptoService,根据文档,这是唯一用于加密数据的非对称加密方案。问题是我对此有很多问题。 (我想做对称加密,但这不是我的老师要我做的,根据他的说法,只要确定一个 block 的大小,然后它就会为你做所有的工作。)好吧,到目前为止运气不好,我尝试了一些不同的方法,但现在我回到基础并再次尝试,这是我当前的代码:

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

如您所见,我生成 key 并通过将公钥发送到存储它的简单类来模拟 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 文档中消除错误的解析错误...

当我运行测试客户端时,如果我使用私钥加密和公钥解密,我会得到一个“ key 不存在异常”,如果我反过来,我会得到一个坏数据异常.

请帮帮我,如果你知道任何好的指南,或者可以告诉我如何更直接地对字符串消息实现公钥/私钥加密,请帮帮我。

感谢任何帮助。

最佳答案

这不是 RSA 加密的方式。

RSA 完全是关于数学的。您加密的是一个数字,因此它的长度必须有限并且与您使用的 RSA key 对长度相匹配。所使用的填充(PKCS#1 或 OAEP)施加了进一步的长度限制。

如果您想使用 RSA 加密大数据,您需要间接进行 - 即使用对称 key 加密大数据并使用 RSA 公钥加密此 key 。

您可以在我的 blog 上阅读有关实现此内容的信息.

关于c# - C#中大数据的RSA加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com