请教高手,C#中用rsa对字符串加密时,出现:不正确的长度是什么意思?怎样解决?

xuehan 2006-07-11 03:13:09
未处理的“System.Security.Cryptography.CryptographicException”类型的异常出现在mscorlib.dll 中。
其他信息:不正确的长度。

加密代码:
private void button1_Click(object sender, System.EventArgs e)
{
string PublicKey="<RSAKeyValue><Modulus>5eELzKltl6pSPJ1JAjt093vYzBvoj/tOEkJInwAZJNnmGy5o1b24hK4+O6affZNfNWwMxO1NMlYzkXKfhwUImzs5AVuo0wkRERvUTgZiFxSNtqZ2Z6tbpvjg2iw7j++N7pBvkIDGE74npcVlNZi7SyXCe5ldKxgxWQxtMX+Eoek=</Modulus><Exponent>AQAB</Exponent><P>/ay65e9ZmlifpI4e7xtAfBQvHnk1H2jN7d7hQmeswxZGiRKwMMZxrMFNK+stuQrXgtmXZ7ULkmReBpFgQx6Ehw==</P><Q>5/x6O205dCYdko/sx1p7FNxUbwAIHWlhILQKIV9Rmj2dUnXzt5nO8scN5gM/azQyQSkQigthMLpgOUzAnQOyDw==</Q><DP>ti3Ig71jIj+nVuxiNuHha7qrJD1z8zy3N6+rIp+GKQzkVyi+tCiwFps0KuhZC91HbMeLvoT87IN8K0dYVJukHQ==</DP><DQ>g+5TOW6xiPuQP+S4HNu5ObDgF8xl0Qw4H5gkVrxVtSkrSlUoSJchWXKY1eGs9HPXzLTk4gz8tfCYfp3GwMT0Qw==</DQ><InverseQ>W+JEpf7UnWwSmLsie6i5xw+ZuWw3hvZ/LecLepyXBdLv/jW4a17omXgWK1UqkH5p8DwbXOudQpii1+7zXpBQuw==</InverseQ><D>cDgpY3K+blCWLsL1liJiWkJaNmHVaRxcI2u6Oex5WdUJkPFZ+iXQwuywsrwHlezwiIrDvQq/KbiNGg7js60QYpIzTZaUDJONBWlcVAjiMFaS0hP72s/1SdXWz5+J0Fqa/QkMxikrZCHJz1TGwtqioeRPGcr0KLItD+aWXJ4CFLU=</D></RSAKeyValue>";

FileStream fsFile = new FileStream("aa.txt",FileMode.Open);
StreamReader fsRead=new StreamReader(fsFile,System.Text.Encoding.GetEncoding("GB2312"),true);

FileStream fsFile1 = new FileStream("bb.txt",FileMode.Create);
StreamWriter fsWrite=new StreamWriter(fsFile1);

string sStr=fsRead.ReadLine();
while(sStr != null)
{
rsa.FromXmlString(PublicKey);
byte[] done1 = rsa.Encrypt(new UnicodeEncoding().GetBytes(sStr),false);
fsWrite.WriteLine(Convert.ToBase64String(done1));
sStr=fsRead.ReadLine();
}
fsRead.Close();
fsFile.Close();

fsWrite.Close();
fsFile.Close();
}


解密代码:
private void button2_Click(object sender, System.EventArgs e)
{
string PrivateKey="<RSAKeyValue><Modulus>5eELzKltl6pSPJ1JAjt093vYzBvoj/tOEkJInwAZJNnmGy5o1b24hK4+O6affZNfNWwMxO1NMlYzkXKfhwUImzs5AVuo0wkRERvUTgZiFxSNtqZ2Z6tbpvjg2iw7j++N7pBvkIDGE74npcVlNZi7SyXCe5ldKxgxWQxtMX+Eoek=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

FileStream fsFile = new FileStream("bb.txt",FileMode.Open);
StreamReader fsRead=new StreamReader(fsFile,System.Text.Encoding.GetEncoding("GB2312"),true);

FileStream fsFile1 = new FileStream("cc.txt",FileMode.Create);
StreamWriter fsWrite=new StreamWriter(fsFile1);

string sStr=fsRead.ReadLine();
while(sStr != null)
{
rsa.FromXmlString(PrivateKey);
byte[] done1 = rsa.Decrypt(Convert.FromBase64String(sStr),false);
fsWrite.WriteLine((new UnicodeEncoding()).GetString(done1));
sStr=fsRead.ReadLine();
}
fsRead.Close();
fsFile.Close();

fsWrite.Close();
fsFile.Close();
}
...全文
3956 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2006-07-12
  • 打赏
  • 举报
回复
还原的时候,也要用上面的编码。
Knight94 2006-07-12
  • 打赏
  • 举报
回复
其实对你来说,转换一种编码方式可能更简便一些,例如:

byte[] done1 = rsa.Encrypt(new UnicodeEncoding().GetBytes(sStr),false);

转换成
byte[] done1 = rsa.Encrypt( Encoding.GetEncoding( "gb2312" ).GetBytes(sStr),false);

这样就可以了
xuehan 2006-07-12
  • 打赏
  • 举报
回复
谢谢Knight94(愚翁),我太笨,请问怎样增加key的长度?
另外,我每次用相同的密钥加密相同的字符串,加密后看到的结果怎么会不一样呢?
上次加密的数据,下次用配对的密钥解密就出错,老是提示:不正确的项
realwar 2006-07-12
  • 打赏
  • 举报
回复
Knight94(愚翁) 说的对. 待加密的内容必须小于rsa算法的模.如果输入的内容长于模的位数,就必须将内容分成若干块加密.我以前自己用汇编实现rsa算法.这个我面对过.不知道你为什么用rsa算法.rsa算法运算慢,感觉你完全可以用AES算法.
Knight94 2006-07-12
  • 打赏
  • 举报
回复
参看
http://www.codeproject.com/csharp/ccryptotcptokenizer.asp

你就知道为什么了

通过
int keySize = rsa.KeySize/8; //KeySize in number of bits,
// so we need to divide that by 8 to convert it
//to bytes.
int blockSize = keySize -11; //keysize less 11 bytes = block size.

这样你就获得最大加密块的大小,我大致测了一下,你的keysize为1024,
按照上面的计算后获得blockSize为117,
而对于
321456789123456789|李军|10400.00|1520232404010120060605900001
来说,通过unicode产生的字节数为120

所以为了能使你的程序不出错,
方法一:增加key的长度;
方法二:修改encoding编码,如果你的文本最多只有中文的话,改用gb2312编码,这样产生的byte要小很多。
xuehan 2006-07-12
  • 打赏
  • 举报
回复
我在其他的地方看到加密数据byte不能大于117,是真的吗?
另外,我每次用相同的密钥加密相同的字符串,加密后看到的结果怎么会不一样呢?
上次加密的数据,下次用配对的密钥解密就出错,老是提示:不正确的项

还望高手能帮我释疑!!跪谢了!
winlcq123 2006-07-12
  • 打赏
  • 举报
回复
mark 一下
stlwj 2006-07-12
  • 打赏
  • 举报
回复
建议用其他加密方法,我用了RSA加解密电脑速度慢。。
xuehan 2006-07-12
  • 打赏
  • 举报
回复
csdn越来越让人失望,这个问题居然没人能解决!!
xuehan 2006-07-12
  • 打赏
  • 举报
回复
我对比别人的方法,看不出什么区别哦,我把我的所有方法的代码贴出来,就三个按扭完成的:

产生密钥对:
private void button3_Click(object sender, System.EventArgs e)
{
string pubkey = rsa.ToXmlString(false);
string prikey = rsa.ToXmlString(true);

FileStream fsFile = new FileStream("jiami.xml",FileMode.Create);
StreamWriter fsWrite=new StreamWriter(fsFile);
fsWrite.WriteLine(prikey);

FileStream fsFile1 = new FileStream("jiemi.xml",FileMode.Create);
StreamWriter fsWrite1=new StreamWriter(fsFile1);
fsWrite1.WriteLine(pubkey);

fsWrite.Close();
fsFile.Close();

fsWrite1.Close();
fsFile1.Close();
}


加密:
StreamReader reader=new StreamReader("jiami.xml");
string sKey=reader.ReadToEnd();
reader.Close();

FileStream fsFile = new FileStream("aa.txt",FileMode.Open);
StreamReader fsRead=new StreamReader(fsFile,System.Text.Encoding.GetEncoding("GB2312"),true);

FileStream fsFile1 = new FileStream("bb.txt",FileMode.Create);
StreamWriter fsWrite=new StreamWriter(fsFile1);

string sStr=fsRead.ReadLine();
while(sStr != null)
{
rsa.FromXmlString(sKey);
byte[] zz=Encoding.GetEncoding( "gb2312" ).GetBytes(sStr);
byte[] done1 = rsa.Encrypt(zz,false);
fsWrite.WriteLine(Convert.ToBase64String(done1));
sStr=fsRead.ReadLine();
}
fsRead.Close();
fsFile.Close();

fsWrite.Close();
fsFile1.Close();



解密:
private void button2_Click(object sender, System.EventArgs e)
{
StreamReader reader=new StreamReader("jiemi.xml");
string sKey=reader.ReadToEnd();
reader.Close();

FileStream fsFile = new FileStream("bb.txt",FileMode.Open);
StreamReader fsRead=new StreamReader(fsFile,System.Text.Encoding.GetEncoding("GB2312"),true);

FileStream fsFile1 = new FileStream("cc.txt",FileMode.Create);
StreamWriter fsWrite=new StreamWriter(fsFile1);

string sStr=fsRead.ReadLine();
while(sStr != null)
{
rsa.FromXmlString(sKey);
byte[] done1 = rsa.Decrypt(Convert.FromBase64String(sStr),false);
fsWrite.WriteLine(Encoding.GetEncoding( "gb2312" ).GetString(done1));
sStr=fsRead.ReadLine();
}
fsRead.Close();
fsFile.Close();

fsWrite.Close();
fsFile1.Close();
}

当程序运行时,我加密后马上解密,没任何问题;但当我加密后关掉程序,再打开程序解密,就提示:不正确的项

然后我测试:运行程序-->加密-->关闭程序,再运行程序-->加密-->关闭程序,两次加密的密钥相同,加密的内容相同,但加密的结果确不一样!!
Knight94 2006-07-12
  • 打赏
  • 举报
回复
总觉得你在使用rsa算法的时候,方法不对,你参考我给你的那篇文章,然后看看其中的例子来进行分析。
xuehan 2006-07-12
  • 打赏
  • 举报
回复
谢谢Knight94(愚翁),其他问题都解决了,还有最后一个问题请教
上次加密的数据,下次用配对的密钥解密就出错,老是提示:不正确的项
我用相同的密钥加密相同的数据进行测试,每次加密后的结果都不一样
这个怎么解决?
skywolfma 2006-07-11
  • 打赏
  • 举报
回复
要那样的话KEY又是一定的,那能加密的最大字符串长度也就是一定的了
Knight94 2006-07-11
  • 打赏
  • 举报
回复
按照msdn中的说法来看,这个长度是要受到key的长度限制,参看
Direct Encryption and OAEP padding not supported Microsoft Windows 98, Microsoft Windows Millenium, or Windows 2000 or later without the high encryption pack installed. The maximum size allowed for a symmetric key.
myminimouse 2006-07-11
  • 打赏
  • 举报
回复
up
xuehan 2006-07-11
  • 打赏
  • 举报
回复
希望哪位帮我测试一下上面的程序,看是否有一样的错误出现
Knight94 2006-07-11
  • 打赏
  • 举报
回复
应该只会对密钥地长度有限制,而对被加密的字符串应该没有此限制。
yinyz 2006-07-11
  • 打赏
  • 举报
回复
可能是数据类型问题,总之绝对不可以直接将密钥写到程序里
skywolfma 2006-07-11
  • 打赏
  • 举报
回复
没用过rsa加密,一般都是上面出的KEY和IV长度不对的问题,这样的没遇见过,帮顶
xuehan 2006-07-11
  • 打赏
  • 举报
回复
to:wuxinrenlydia(俺是河南妞)
我的密钥是直接写到程序里的(见上面程序),不会错,而且
321456789123456789|李军|10400.00|1520232404010120060605900001
改成
321456789123456789|李军|1040.00|1520232404010120060605900001没任何问题

我跟踪了一下,rsa.Encrypt(zz,false)中zz大于等于118就出错
加载更多回复(3)
【课程介绍】     课程目标:             - 有状态登录和无状态登录的区别             - 常见的非对称加密算法和非对称的加密方式             - 老版本只使用jwt进行加密的弊端             - 授权中心的授权流程             - 如何整合网关组件实现jwt安全验证             - 理解什么是公钥什么是私钥      - 深刻理解授权流程什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?- 服务端保存大量数据,增加服务端压力- 服务端保存用户状态,无法进行水平扩展- 客户端请求依赖服务端,多次请求必须访问同一台服务器。什么是无状态? 微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:- 服务端不保存任何客户端请求者信息- 客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份带来的好处是什么呢?- 客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务- 服务端的集群和状态对客户端透明- 服务端可以任意的迁移和伸缩- 减小服务端存储压力

110,566

社区成员

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

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

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