• UKEY(D816K)加密流程


    一、原理概述
    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.点击生成模板工程,此时生成成功后会同时设置加密锁。

  • 相关阅读:
    go编程资料库
    ubuntu上安装notepadpp
    ubuntu上安装firefox
    golang之下载安装配置
    ubuntu上制作应用程序的快捷图标启动
    ubuntu上安装字体
    装机必备
    uml设计之多重性
    数据库冗余是否必要
    GitHub上传文件不能超过100M的解决办法
  • 原文地址:https://www.cnblogs.com/zwbsoft/p/16697548.html
Copyright © 2020-2023  润新知