请教C# RSA加解密签名验签的 字符字节编码问题

mesunwen 2014-02-13 04:02:54
用.net的RSA类进行公私钥对签名和验签。RSA.Signdata()的值是byte[]格式,要转成string格式,结果总是乱码。代码如下:

//私钥签名
string pfxpath = @"D:\test.pfx";
string mingwen = "abc123"
X509Certificate2 x5092 = new X509Certificate2(pfxpath, "123456");
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)x5092.PrivateKey;
byte[] mingwenbyte = Encoding.UTF8.GetBytes(mingwen);
byte[] encrypt = rsa.SignData(mingwenbyte, "SHA1");
string encryptstring1 = encrypt.ToString(); //方法1
string encryptstring2 = Encoding.UTF8.GetString(encrypt); //方法2
string encryptstring3 = Encoding.Default.GetString(encrypt); //方法3
string encryptstring4 = Encoding.Unicode.GetString(encrypt); //方法4

以上用了4种方法,得出的都是乱码,这里说的乱码指:不是像“a783hf73hs3yf7”这样的由数字和英文组成的字符,而是变成了“|QI攟玛8彗n拧&勷|?漄I姩?戻?觿稫o”这样的乱码。

请问应该怎样,才能把签名结果由byte[]转成像“a783hf73hs3yf7”这样的字符串。


另外,用x509.PublicKey.Key.ToXmlString(false)得出的公钥字符串(xml里面的值),和x509.GetPublicKeyString()得到的公钥字符串,也不同 ,应该也是编码的问题。真搞不明白这些编码啊






...全文
609 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mesunwen 2014-02-13
  • 打赏
  • 举报
回复
非常感谢"rtdb",终于搞定了,确实是16进制,最后用rsa签名得到的结果和厂商的一致。 谢谢了
rtdb 2014-02-13
  • 打赏
  • 举报
回复

  StringBuilder ret = new StringBuilder() ;
  foreach (byte bt in encrypt)
  {
     ret.Append(bt.ToString("X2"));
  }
  return ret.ToString();
mesunwen 2014-02-13
  • 打赏
  • 举报
回复
请教“rtdb”,我代码里面应该怎样写把signdata得到的byte[]转成16进制呢 string encryptstring1 = encrypt.ToString("X2"); 这样出错哦
rtdb 2014-02-13
  • 打赏
  • 举报
回复
厂商的应该是16进制。 byte b.ToString("X2");
mesunwen 2014-02-13
  • 打赏
  • 举报
回复
string encryptstring4 = Convert.ToBase64String(encrypt); 得出的值是“lHwSwuo45eduxaEmhPB8kCOdUQRJHYqotSuR+NET04S3S287+7LSrf2hRAthW8W8PfeB2Cp7+Xfr2VPssuCAnLsWv/38xXg106lUI1GgE8f2u39yfxFPgqmu0Bm5bFAQQAmAmfRoYaSJG020e9u5aSo5KrEHFSsEBKCECGJAqGU=” 用厂商控件得出的值是“3279266D876C7D54FC059FF481C512D31924047749CF58D7B08E886E79B5AE8804A7A9BECAFD4BBF47BD05D608E244966167DAEC1E9529707395C6F49ADD1E2825CF4F59DE129A29FE9E9B88B4B0187278F79439268FFA01DC2423EAB32B1179597CE5156EBE9E5BD26C59A4C7EB0B868EBCBC8074A247688C10FE653E2FC9CD” 应该是两种编码不同的原因,厂商那个应该是UTF-8的吧。我用微软.net的rsa,怎样得到UTF-8格式的值呢
rtdb 2014-02-13
  • 打赏
  • 举报
回复
好像有些加密算法,得到的加密结果就是不一样的,能解回去就行。
mesunwen 2014-02-13
  • 打赏
  • 举报
回复
对,试过ToBase64String,忘记写上去,ToBase64String后的签名值,好像也不对,中间有 "/"线。和另外一个厂商的控件用同样的私钥和加密算法,得出的string不同。
rtdb 2014-02-13
  • 打赏
  • 举报
回复
Convert.ToBase64String(encrypt);
rtdb 2014-02-13
  • 打赏
  • 举报
回复
encrypt后的数据肯定不能直转为可读字符的, 要用base64编码转string。

110,538

社区成员

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

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

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