UKEY(D8-16K)加密流程
一、原理概述
1.先从服务器端生成一个随机数,然后将该随机数发给加密锁,同时服务器端使用与加密锁内对应的增强算法对该随机数进行加密,
生成一服务器端验证码。
2.客户端在获得服务器发过来的随机数后,客户端使用对应的算法同样对该随机数进行加密,生成客户端验证码,
返回给服务器。
3.如果相同,则为合法用户。
4.只有在服务器端的加密密钥与设置在锁中的加密密钥一致时,两边的 加密结果才能相符,才能被合法验证。
二、加密步骤
1.判断服务器是否安装客户端程序
function myonLoad()
{
try
{
var s_pnp=new SoftKey3W();
s_pnp.Socket_UK.onopen = function()
{
bConnect=1;//代表已经连接,用于判断是否安装了客户端服务
}
}
catch(e)
{
alert(e.name + ": " + e.message);
return false;
}
}
2.生成随机数
this.strData= GetRandomNum(1,65535)+GetRandomNum(1,65535);//赋值随机数,以实现一次一密
3.服务器端加密
var m_StrEnc = mSoftKey.StrEnc(this.strData,Key);
4.获取客户端信息及加密处理
s_simnew1.Socket_UK.onmessage =function got_packet(Msg)
{
var UK_Data = JSON.parse(Msg.data);
// alert(Msg.data);
if(UK_Data.type!="Process")return ;//如果不是流程处理消息,则跳过
switch(UK_Data.order)
{
case 0:
{
s_simnew1.FindPort(0);//发送命令取UK的路径
}
break;//!!!!!重要提示,如果在调试中,发现代码不对,一定要注意,是不是少了break,这个少了是很常见的错误
case 1:
{
if( UK_Data.LastError!=0){window.alert ( "未发现加密锁,请插入加密锁");s_simnew1.Socket_UK.close();return false;}
DevicePath=UK_Data.return_value;//获得返回的UK的路径
s_simnew1.GetID_1(DevicePath); //发送命令取ID_1
}
break;
case 2:
{
if( UK_Data.LastError!=0){ window.alert("返回ID号错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_1=UK_Data.return_value;//获得返回的UK的ID_1
s_simnew1.GetID_2(DevicePath); //发送命令取ID_2
}
break;
case 3:
{
if( UK_Data.LastError!=0){ window.alert("取得ID错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_2=UK_Data.return_value;//获得返回的UK的ID_2
that.KeyID=toHex(ID_1)+toHex(ID_2);
s_simnew1.ContinueOrder();//为了方便阅读,这里调用了一句继续下一行的计算的命令,因为在这个消息中没有调用我们的函数,所以要调用这个
}
break;
case 4:
{
//获取设置在锁中的用户名
//先从地址0读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=0;
s_simnew1.YReadEx(addr,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址0的数据
}
break;
case 5:
{
if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据
}
break;
case 6:
{
if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据
//再从地址1读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=1;
s_simnew1.YReadString(addr,mylen, "ffffffff", "ffffffff", DevicePath);//发送命令从UK地址1中取字符串
}
break;
case 7:
{
if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.UserName=UK_Data.return_value;//获得返回的UK地址1的字符串
//获到设置在锁中的用户密码,
//先从地址20读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=20;
s_simnew1.YReadEx(addr,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址20的数据
}
break;
case 8:
{
if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据
}
break;
case 9:
{
if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据
//再从地址21读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=21;
s_simnew1.YReadString(addr,mylen,"ffffffff", "ffffffff", DevicePath);//发送命令从UK地址21中取字符串
}
break;
case 10:
{
if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.Password=UK_Data.return_value;//获得返回的UK中地址21的字符串
//这里返回对随机数的HASH结果
s_simnew1.EncString(that.myrnd,DevicePath);//发送命令让UK进行加密操作
}
break;
case 11:
{
if( UK_Data.LastError!=0){ window.alert("进行加密运行算时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.return_EncData=UK_Data.return_value;//获得返回的加密后的字符串
//所有工作处理完成后,关掉Socket
s_simnew1.Socket_UK.close();
resolve(true);
}
break;
}
}
三、keytool 加密锁管理工具使用说明
1.在代码生成器中选择开发语言为NetCore
2.设置自定义算法密码
3.输入自定义读写密码
4.输入加密锁密码
5.勾选生成加密代码的同时设置加密锁
6.点击生成模板工程,此时生成成功后会同时设置加密锁。
本文来自博客园,作者:zwbsoft,转载请注明原文链接:https://www.cnblogs.com/zwbsoft/p/16697548.html
电话微信:13514280351