高分求解如何解决System.Security.Cryptography.RSACryptoServiceProvider的效率问题

sportsman 2005-04-27 04:34:04
以下算法单线程执行需要0.2秒的执行时间,远远不能达到并发处理的要求。。
求解决方案。
public string RSAEncrypt(string m_strEncryptString)
{
try
{

byte[] PlainTextBArray;
byte[] CypherTextBArray;
string Result;
System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
Result=Convert.ToBase64String(CypherTextBArray);
return Result;

}
catch(Exception ex)
{
throw ex;
}
}
...全文
576 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sportsman 2005-04-28
  • 打赏
  • 举报
回复
另外把
System.Security.Cryptography.RSACryptoServiceProvider rsa
这个对象放在cache中,提高了相当的性能。。
sportsman 2005-04-27
  • 打赏
  • 举报
回复
非常感谢ET2004的回答,如果实际应用中再需要性能的提高~另开高分贴 :)
ET2004 2005-04-27
  • 打赏
  • 举报
回复
using System;
using System.Security.Cryptography;

namespace ConsoleApplication1
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(1024);
string xmlPublicKey = provider.ToXmlString(false);
RSACrypter crypter = new RSACrypter(xmlPublicKey);

Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));
Console.WriteLine(crypter.RSAEncrypt("Hello, World!"));
Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));

Console.WriteLine();

Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));
Console.WriteLine(crypter.RSAEncrypt("CSDN Community"));
Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));

Console.WriteLine();

Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));
Console.WriteLine(crypter.RSAEncrypt("Visual Studio"));
Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.ff"));
}
}

public class RSACrypter
{
private string xmlPublicKey;
private RSACryptoServiceProvider provider;

private RSACryptoServiceProvider CryptoProvider
{
get
{
if (this.provider == null)
{
this.provider = new RSACryptoServiceProvider();
this.provider.FromXmlString(this.xmlPublicKey);
}
return this.provider;
}
}

public RSACrypter(string xmlPublicKey)
{
this.xmlPublicKey = xmlPublicKey;
}

public string RSAEncrypt(string text)
{
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text);
byte[] encryptedBytes = this.CryptoProvider.Encrypt(bytes, false);
return Convert.ToBase64String(encryptedBytes);
}
}
}

测试结果:

05:04:30.00
JvP/uFm5wMDNECqTOnEiyn3U6pbD50ZyHDlVOSXXGARsVFEbHJcA9q0zffjCVH2pG/V52yf820k74Due
a9DFspvFKrIv2nPsjQciNYvPgUwFqGni40K3MbAhIrcYgX4XUP4P1jvTi6T9q/LIjE0xqrJfFKs6ir5g
qrUKRET9Cfo=
05:04:30.10

05:04:30.10
hop/6z6aXttsp+lLJ5LkNL4Dj17mDI0podK9oOsr2ys0zWehsqxMqmqngNOguYEY6I4eZeQhFdbpMmN7
5stELAmo+KzdceoxqhbJGhfBitUIjxHBO2SOoQrbYOGpdyKWsnxYjwIk2m3sUWLBw22R9MsupMpGrL4N
Xpxn0d7p64U=
05:04:30.10

05:04:30.10
WXFbEbUr42F9oXsXiDC9tAsCFMX+ODGHlTFgw1RhFDuW9UHUltoGvYXoIMQEvl8nJLv5N2tDXp+UO6Mt
PX2O1NZIth5dm/fxVSyy/wfQJgRUyxFEpwa+eoMBly45NlhYZMMqO3qWLn+Z1elSPX5UerzMRnGlzD/z
33uNMUihOkI=
05:04:30.10

由于 Console.WriteLine 和 DateTime.ToString 会对测试结果有所影响,而且 DateTime 的
精度为 0.18ms,所以其实际效果会更理想(第一次调用为 0.1s 以内,以后调用远小于 0.1s)。
ICTech 2005-04-27
  • 打赏
  • 举报
回复
mark
ET2004 2005-04-27
  • 打赏
  • 举报
回复
改写后的算法如下:
public class Crypter
{
private RSACryptoServiceProvider provider;
private RSACryptoServiceProvider CryptoProvider
{
get
{
if (this.provider == null)
{
this.provider = new RSACryptoServiceProvider();
}
return this.provider;
}
}

public string RSAEncrypt(string text)
{
// Definition of xmlPublicKey?
this.CryptoProvider.FromXmlString(xmlPublicKey);
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text);
byte[] encryptedBytes = this.CryptoProvider。Encrypt(bytes, false);
string encryptedString = Convert.ToBase64String(encryptedBytes);
return encryptedString;
}
}
ET2004 2005-04-27
  • 打赏
  • 举报
回复
还有,每调用一次 RSAEncrypt 方法都会构造 RSACryptoServiceProvider 和 UnicodeEncoding 实例,这可能会对性能造成影响。
ET2004 2005-04-27
  • 打赏
  • 举报
回复
建议不要在 try {} 块中包含太多代码,如变量声明、返回值等语句,一般来说是不可能发生异常的(除非硬件故障 -.-),catch {} 不要捕获一般异常 Exception,而是捕获 SecurityException 等精确异常。

以上建议可能不会对性能造成太大影响,仅供参考 ^_^
yzgnick 2005-04-27
  • 打赏
  • 举报
回复
关注,顶一下!
sportsman 2005-04-27
  • 打赏
  • 举报
回复
自己up一下。。
有没有这方面有经验的高手在阿。。在线等。。。提示就给分~或改写算法,或在线程上做文章~~
有同样需求的朋友也顶一下呀。。顶就给分噢。。。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧