Js参数RSA加密传输之jsencrypt.js的使用
注意几点:
1、参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了。
1、前端代码
Login $(function(){ varencrypt=newJSEncrypt(); encrypt.setPublicKey($("#tra").val()); vardata=encrypt.encrypt("123456789"); alert(data); $("#btn").click(function(){ $.ajax({ url:'@Url.Action("Login")', data:"pwd="+encodeURI(data).replace(/\+/g,'%2B'),//+号的处理:因为数据在网络上传输时,非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,而base64编码在传输到后端的时候,+会变成空格,因此先替换掉。后端再替换回来 type:'post', success:function(msg){ alert(msg); } }); }); }); MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa4KHNwDX44gGmmIAtRu4gjVYt GWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTl G3ihsCT6dT9H5B9OoeR7K9VWUesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6P SQyvdfiRdV4r07crpQIDAQAB
注意+好的处理
2、后端代码
publicclassIndexController:Controller {publicActionResultLogin() { returnView(); } [HttpPost] publicActionResultLogin(stringpwd) { //密钥格式要生成pkcs#1格式的而不是pkcs#8格式的 stringprivateKey=@"MIICWwIBAAKBgQCa4KHNwDX44gGmmIAtRu4gjVYtGWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTlG3ihsCT6dT9H5B9OoeR7K9VW UesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6PSQyvdfiRdV4r07crpQIDAQAB AoGABb+3gdb+qeG0b1CogVsT/7//UOaTzPk/FGneKQQTf4SsN+H7lVhTYTG9ARFC JyoWg8IXqmn2ljhywHPTWWD2RCZIn2sYT1sVkGb70EgHGQLBraFHElmw+DsVJ+nD fBCfMrJ1TYXlwigjRkaueaoGgG8LdR8XD+Xs5LersPLjZgECQQCguSB7C4wF6oSw EDmwNF8ffT5cQc1U2OIq6NBG8rafrjb7LsjhOd03pmY7i4LbW3Vvq4AhQpJEdF1C vd+Sk/BBAkEA9rBhqnyumV09zFEomSX3zZu+bdhTzM4bJDfEa95swp1gANCVvF/t DCnlBf51EhCWdeGSpARPUkQnXrYfFUDiZQJAAZEshuaa6+fYeVr/JP+tucHf3Mhr dxtSQTbZ6QcuzqnFMXfIT6HfzU4bCxOWKAthPsB+VFSw1mgIDMGLL4OvwQJAJlVy V9PYLezXVZCnBmVoBINXLCqZmxHMFey0kS6XKAbcjEPdgNBHPcSk2jGYb540Q00y RFqHGPmORKF4Yw0aIQJAd5JRtD3z2MgP/vPoKHJNHqY8bboVcmwqVAm6xCZoTCZz jNV1Cnsdf4wBV3LCDzYBy+xR4qYNUy5CFXN+8WzzAA=="; try { RSACryptoServiceProviderrsaCryptoServiceProvider=CreateRsaProviderFromPrivateKey(privateKey); //把+号,再替换回来 byte[]res=rsaCryptoServiceProvider.Decrypt(Convert.FromBase64String(pwd.Replace("%2B","+")),false); returnContent(Encoding.UTF8.GetString(res)); } catch(Exceptionexception) { } returnContent(""); } privateRSACryptoServiceProviderCreateRsaProviderFromPrivateKey(stringprivateKey) { varprivateKeyBits=System.Convert.FromBase64String(privateKey); varRSA=newRSACryptoServiceProvider(); varRSAparams=newRSAParameters(); using(BinaryReaderbinr=newBinaryReader(newMemoryStream(privateKeyBits))) { bytebt=0; ushorttwobytes=0; twobytes=binr.ReadUInt16(); if(twobytes==0x8130) binr.ReadByte(); elseif(twobytes==0x8230) binr.ReadInt16(); else thrownewException("Unexpectedvaluereadbinr.ReadUInt16()"); twobytes=binr.ReadUInt16(); if(twobytes!=0x0102) thrownewException("Unexpectedversion"); bt=binr.ReadByte(); if(bt!=0x00) thrownewException("Unexpectedvaluereadbinr.ReadByte()"); RSAparams.Modulus=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.Exponent=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.D=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.P=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.Q=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.DP=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.DQ=binr.ReadBytes(GetIntegerSize(binr)); RSAparams.InverseQ=binr.ReadBytes(GetIntegerSize(binr)); } RSA.ImportParameters(RSAparams); returnRSA; } privateintGetIntegerSize(BinaryReaderbinr) { bytebt=0; bytelowbyte=0x00; bytehighbyte=0x00; intcount=0; bt=binr.ReadByte(); if(bt!=0x02) return0; bt=binr.ReadByte(); if(bt==0x81) count=binr.ReadByte(); else if(bt==0x82) { highbyte=binr.ReadByte(); lowbyte=binr.ReadByte(); byte[]modint={lowbyte,highbyte,0x00,0x00}; count=BitConverter.ToInt32(modint,0); } else { count=bt; } while(binr.ReadByte()==0x00) { count-=1; } binr.BaseStream.Seek(-1,SeekOrigin.Current); returncount; } }
总结
以上所述是小编给大家介绍的Js参数RSA加密传输之jsencrypt.js的使用,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。