第一次写博客.
最近想做一个Web的自动登录,用户名和密码是RSA加密过的,后台是用的JAVA,我只会点C#,抓包什么都搞定了(使用的是Fiddler),不过由于C#和RSA的加密方式不同,我搞了N天,都搞不定,中间问过很多人,愿意帮助的人不多,可能是我太菜了.就是为了得到个认证的cookie,我中间用过Webbrowser控件,让人自己登录,然后得到Cookie,不过感觉终究是个半成品.
然而,C#和Java中间的RSA互转,我遇到了2个问题,网上都是public key 转 public key ,可惜,我只有exponent,modulus,要用这2个生成新的public key ,学习过C的程序员,看Java代码都多少看懂一些,我看了很多Java代码生成public Key的,很多转换的,最后的生成的RSA加密数据,总是系统访问失败.我对RSA一知半解,而且中间很多 ToBase64 ,From Base64, ToHex,FromHex,Btye[],我又去看了下编码,可惜,基础太差,都是一知半解.我按照,网上的代码,来回转换,在生成,不过可惜还是系统访问失败.
我就想,什么是加密,只要他们中间几次编码的转换顺序和步骤,和我的不一样,我就走进了死胡同.我试着想通读JavaScript生成密文的文件,不过还是基础太差,中间有一些算法,和 BigInt 类型,很复杂,我想我可以看完,不过人家改几个代码,工作又白费了.最好的办法是运行他提供的JavaSrcipt 文件来生成密文.
我开始找C#运行JavaScript的办法,有2类,一个是使用 过时的 sciptcontrol ,2010年前的技术,而且64支持不好,都是坑啊.还有一种就是运行第三方类库.我使用VS2017 NuGet 输入Javascript 找到了 Javascript.Net,就是它了.
不过网上学习资料很少,而且登录他的官网,都是English,我这小学英语,真是有点吃不消啊,看不懂英文,我们百度,谷歌翻译,找到词条,进入文档,看代码.(http://javascriptdotnet.codeplex.com/documentation)
class Program { public class SystemConsole { public SystemConsole() { } public void Print(string iString) { Console.WriteLine(iString); } } static void Main(string[] args) { // Initialize the context using (JavascriptContext context = new JavascriptContext()) { // Setting the externals parameters of the context context.SetParameter("console", new SystemConsole()); context.SetParameter("message", "Hello World !"); context.SetParameter("number", 1); // Running the script context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;"); // Getting a parameter Console.WriteLine("number: " + context.GetParameter("number")); } } }
是不是很强大,竟然可以和C#对象交互.
不过我想使用的是文件,不是字符串啊.继续看代码,不过代码很少,看了提问里面,找代码.有一个.
static void Main(string[] args) { string script = "function test(a,b){return a+b;} test('abc','def');"; try { using (JavascriptContext context = new JavascriptContext()) { string result = (string)context.Run(script, "test"); Console.WriteLine(result); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } }
这可以调用方法.太棒了,自己改下.找了半天发现,不支持直接调用文件.自己改下.
string script = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory+ @"..\..\js\Base64.js"); script += File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"..\..\js\security.js"); script += File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"..\..\js\base.js"); try { using (JavascriptContext context = new JavascriptContext()) { //exponent,modulus,password,usercode context.SetParameter("console", new SystemConsole()); context.SetParameter("exponent", "10001"); context.SetParameter("modulus", "89ded116f36bf4e6108f549379f0137661a432e64fa80ae13cf1d0bb9fc957d16ee69a44383e3e4d0195e58f700ee7b4b00fa08f73a0cf6fcb517e3a772a1d2cfc96d2aa4d1df8b1c3a09f7c4ad4c3e29d427b6f96269d3d15db9da9d63fd2fface9299d63f4f17c1fc2565efcbe64b84e2a029f0a60a889106c3287f6a0be07"); context.SetParameter("password", "coky"); context.SetParameter("usercode", "1234"); context.SetParameter("usercodeRSA",""); //context.SetParameter("window", null); context.Run(script, "test"); Console.WriteLine("usercodeRSA : " + context.GetParameter("usercodeRSA")); Console.WriteLine("passwordRSA : " + context.GetParameter("passwordRSA")); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } Console.Read();
下面是Javascript文件,这个是我自己编写的,其他2个文件
Base64.js
security.js
我用字符串把他们串联起来.不过我觉得在最前面的,应该是依赖最小的,对Javascript具体语法不是很了解,不过我觉得这样保险.
var usercodeRSA var passwordRSA console.Print("base start"); function test(exponent,modulus,password,usercode) { console.Print("exponent:"+exponent); console.Print("modulus:"+modulus); console.Print("password:"+password); console.Print("usercode:"+usercode); console.Print("=============================================================="); RSAUtils.setMaxDigits(200); var key = new RSAUtils.getKeyPair(exponent, '', modulus); console.Print("Key:" + key); console.Print("=============================================================="); var b64 = base64encode(password); console.Print("password base64encode:" + b64); console.Print("=============================================================="); var reversedPwd = b64.split("").reverse().join(""); console.Print("password base64encode reverse:" + reversedPwd); console.Print("=============================================================="); passwordRSA = RSAUtils.encryptedString(key, reversedPwd); console.Print("password RSAencry:" + passwordRSA); console.Print("=============================================================="); b64 = base64encode(usercode); console.Print("usercode base64encode:" + b64); console.Print("=============================================================="); reversedPwd = b64.split("").reverse().join(""); console.Print("usercode base64encode reverse:" + reversedPwd); console.Print("=============================================================="); usercodeRSA = RSAUtils.encryptedString(key, reversedPwd); console.Print("usercode RSAencry:" + usercodeRSA); console.Print("=============================================================="); } test(exponent,modulus,password,usercode);
运行一下.
大功告成.第一次写,写的很一般.有看不懂,欢迎留言 或者QQ:2786771252