+ -
当前位置:首页 → 问答吧 → TestZhuzhan.dll,最近用C#写这方面的代码

TestZhuzhan.dll,最近用C#写这方面的代码

时间:2011-12-15

来源:互联网

C# code

 /*-------------------------------------------------------------
            1. 身份认证函数
            函数名称 IdentityAuthentication(char *Div,char *RandAndEndata)
            函数功能身份认证取随机数和密文
            Div,输入参数,8 字节分散因子,16 进制字符串。
            参数说明 RandAndEndata,输出参数,字符型,8 字节随机数+8 字节
            密文。
            成功标志 0,成功;
         */
        [DllImport("TestZhuzhan.dll", EntryPoint = "IdentityAuthentication")]
        private static extern int IdentityAuthentication(string Div, byte[] RandAndEndata);

        /*
             * 2.远程控制函数
                函数名称 UserControl(char *RandDivEsamNumData,char *dataOut)
                函数功能远程控制
                RandDivEsamNumData,输入参数,字符型,4 字节随机数
                参数说明 +8字节分散因子+8字节ESAM序列号+数据明文。
                dataOut,字符型,20 字节密文
                成功标志 0,成功;
                200,连接加密机失败;
                201,写卡失败;
                202,读卡失败;
                203,计算密文失败;
         */
        [DllImport("TestZhuzhan.dll", EntryPoint = "UserControl")]
        private static extern int UserControl(string RandDivEsamNumData, byte[] dataOut);
        /*
        充值函数
        函数名称 InCreasePurse(char *RandDivData,char *dataout)
        函数功能钱包充值
        4 字节随机数;
        8 字节分散因子;
        电量和次数,8 字节;
        RandDivData
        (字符型)
        首次充值时,6 字节户号。
        参数说明
        dataout 返回电量,次数和4 字节MAC。
        成功标志 0,成功;
        */
        [DllImport("TestZhuzhan.dll", EntryPoint = "UserControl")]
        private static extern int InCreasePurse(string RandDivData, byte[] dataOut);

        public int InCreasePurseWithMoney(string Ramdata,int DlValue,int CS,string UserID,out string RamValue,out string SendData)
        {
            string RandDivData = "";
            RandDivData = RandDivData + Ramdata;
            RandDivData = RandDivData + Fsyz;
            RandDivData = RandDivData;
            RamValue = "";
            SendData = "";
            return 1;
        }
        /*
             * 4.参数更新函数
            函数名称 ParameterUpdate(char *RandDivApduData,char *dataout)
            函数功能更新参数
            4 字节随机数;
            8 字节分散因子;
            更新指令 10 位(04d682+起始+LC);
            LC=明文数据长度+4。
            RandApduDivData
            (字符型)
            其他为参数明文。
            参数说明
            dataout 返回参数明文和MAC。
            成功标志 0,成功;         */
        [DllImport("TestZhuzhan.dll", EntryPoint = "ParameterUpdate")]
        private static extern int ParameterUpdate(string RandDivApduData, byte[] dataout);

        /*
                 * 5.密文+MAC 参数更新函数
                    函数名称 ParameterElseUpdate(char *RandDivApduData,
                    char *EsamNum,char *dataout)
                    函数功能密文+MAC 更新参数
                    4 字节随机数;
                    8 字节分散因子;
                    更新指令 10 位(04d6+文件标识+00+LC);
                    (此处 LC 长度为下发密文数据+MAC 的长
                    度)
                    RandApduDivData
                    (字符型)
                    其他为参数明文。
                    EsamNum 输入参数,8 字节ESAM 序列号。
                    参数说明
                    dataout 返回参数密文和MAC。
                    电能表接收密文+MAC 后,用04d6+文件标
                    识+00+LC+密文+MAC 更新ESAM 文件,然
                    后明文读取数据,该文件第一个字节为明文
                    数据的长度(HEX),可以根据该长度取所
                    解密后的明文。
                    成功标志 0,成功;         */
        [DllImport("TestZhuzhan.dll", EntryPoint = "ParameterElseUpdate")]
        private static extern int ParameterElseUpdate(string RandDivApduData, string EsamNum, byte[] dataout);

        public int UpdateMacAndPassData(string RamData, string FileMark,string MacData, string EsamData, out string OutRandAndEndata, out string SendData)
        {
            int LC = RamData.Length / 2 + MacData.Length; 
            string RandDivApduData = RamData;
            RandDivApduData = RandDivApduData + "04d6" + FileMark + "00" +GetEvenData(Convert.ToString(LC,16))+  MacData;
            byte[] rtnData=new byte[40];
            SendData = RandDivApduData;
            int rtnValue = ParameterElseUpdate(RandDivApduData, EsamData, rtnData);
            OutRandAndEndata = Encoding.UTF8.GetString(rtnData);
            return rtnValue;

        }

        /*
             * 密钥更新函数
                函数名称 KeyUpdate(int kid ,char *DivEsamNumRandData,char *dataOut)
                函数功能更新密钥
                Kid 整型,
                kid=1,身份认证密钥;
                kid=2,远程控制密钥;
                Kid=3,参数更新密钥。
                DivEsamNumRandData 输入参数,字符型,8 字节分散因子+8
                字节ESAM序列号+4字节随机数+4字节数据明文。
                参数说明
                dataout 返回32 字节密文+ 4 字节密钥信息+4 字节MAC。
                成功标志 0,成功;         */
        [DllImport("TestZhuzhan.dll", EntryPoint = "KeyUpdate")]
        private static extern int KeyUpdate(int kid, string DivEsamNumRandData, byte[] dataout);
        /// <summary>
        /// 密钥更新函数    
        /// int Kid           kid=1,身份认证密钥;kid=2,远程控制密钥;Kid=3,参数更新密钥;
        /// string EsamData   8字节ESAM序列号;
        /// string RamData    4字节随机数;
        /// string DataItem   4字节数据明文;
        /// out string OutRandAndEndata    返回32 字节密文+ 4 字节密钥信息+4 字节MAC
        /// out string SendData      发送的内容数据
        /// </summary>
        public int MeterKeyUpdate(int Kid, string EsamData, string RamData, string DataItem, out string OutRandAndEndata, out string SendData)
        {
            string DivEsamNumRandData = "";
            DivEsamNumRandData = Fsyz;
            DivEsamNumRandData = DivEsamNumRandData + EsamData;
            DivEsamNumRandData = DivEsamNumRandData + RamData;
            DivEsamNumRandData = DivEsamNumRandData + DataItem;
            byte[] rtnData = new byte[32 + 4 + 4];
            int rtnValue = KeyUpdate(Kid, DivEsamNumRandData, rtnData);
            SendData = DivEsamNumRandData;
            OutRandAndEndata = Encoding.UTF8.GetString(rtnData);
            return rtnValue;
        }


        /*
              * 7.校验MAC 函数
                函数名称 Maccheck(char *RandDivData,char *dataout)
                函数功能校验 MAC
                RandDivApduData 输入参数,4 字节随机数+8 字节分散因子+5
                字节指令(04d68600+LC)+数据明文+4 字节MAC。
                LC=明文长度+0x0C;
                参数说明
                dataout 空
                成功标志 0,成功;其他 MAC 错
         */

        [DllImport("TestZhuzhan.dll", EntryPoint = "Maccheck")]
        private static extern int Maccheck(string RandDivApduData, byte[] dataout);
        /// <summary>
        /// 校验Mac函数
        /// string RamData        4个字节随机数;
        /// string DataItem       数据明文内容
        /// string MacData        4个字节的MAC内容
        /// out string SendData   返回发送的数据内容
        /// 返回 成功标志 0,成功;其他 MAC 错
        /// </summary>
        /// <param name="RamData"></param>
        /// <param name="DataItem"></param>
        /// <param name="MacData"></param>
        /// <param name="SendData"></param>
        /// <returns></returns>
        public int CheckMeterMAC(string RamData, string DataItem, string MacData, out string SendData)
        {
            int LenData = DataItem.Length / 2;
            LenData = LenData + 0xc;
            string RandDivApduData = "";
            RandDivApduData = RamData;
            RandDivApduData = RandDivApduData + Fsyz;
            RandDivApduData = RandDivApduData + "04d68600" + GetEvenData(Convert.ToString(LenData,16)) ;
            RandDivApduData = RandDivApduData + DataItem;
            RandDivApduData = RandDivApduData + MacData;
            byte[] rtnData = null;
            SendData = RandDivApduData;
            int rtnValue = Maccheck(RandDivApduData, rtnData);
            return rtnValue;
        }
        /// <summary>
        ///    身份认证函数
        ///    函数功能身份认证取随机数和密文
        ///    Div,输入参数,8 字节分散因子,16 进制字符串。
        ///    返回字符型:8 字节随机数+8 字节密文。
        ///    成功标志 0,成功;200,连接加密机失败;201,取随机数1 失败;202,取随机数2 失败;
        ///    203,密钥分散失败;
        ///    204,数据加密失败;
        ///    205,取密文失败;
        /// </summary>
        /// <param name="OutRandAndEndata"></param>
        /// <returns></returns>
        public int GetIdentityAuthentication(out string OutRandAndEndata,out string SendData)
        {
            int RetrnValue = 0;
            byte[] rtnValue = new byte[32];
            SendData = Fsyz;
            RetrnValue = IdentityAuthentication(Fsyz, rtnValue);
            OutRandAndEndata = Encoding.UTF8.GetString(rtnValue);
            return RetrnValue;
        }
       
        /// <summary>
        /// 获取远程控制20个字节密文
        /// string CtrlCode      控制命令
        /// string RandomData    4个字节随机数
        /// string EsamID        8个字节的ESAM序列号
        /// DateTime TestTime    时间参数
        /// out string MyData    返回20个字节密文
        /// </summary>
        /// <param name="CtrlCode"></param>
        /// <param name="RandomData"></param>
        /// <param name="EsamID"></param>
        /// <param name="TestTime"></param>
        /// <param name="MyData"></param>
        /// <returns></returns>
        public int GetPasswordData(string CtrlCode, string RandomData,string EsamID, string TestTime, out string MyData,out string SendData)
        {
            int OkData = 0;
            byte[] rtnValue = new byte[40];
            StringBuilder Data = new StringBuilder();
            Data.Append(RandomData); 
            Data.Append(Fsyz);
            Data.Append(EsamID);
            Data.Append(CtrlCode);
            Data.Append("00");
            Data.Append(TestTime);
            SendData = Data.ToString();
            OkData = UserControl(Data.ToString(), rtnValue);
            MyData = Encoding.UTF8.GetString(rtnValue);
            return OkData;
        }



第1个函数和第2个函数没问题了。后面几个函数有些不明白,主要是有些参数不清楚

作者: ucyhboy   发布时间: 2011-12-15

沙发,帮顶、

作者: kingboy2008   发布时间: 2011-12-15

这个要结合业务来看

作者: Sandy945   发布时间: 2011-12-15

本人已经调通了身份认证和远程控制功能,后面的一些函数主要是一些参数不明白,希望高手能共赏资源。
1)充值函数中的电量和次数,8 字节;不知道是如何分配的电量几个字节,次数是几个字节;
2)参数更新函数中的 更新指令 10 位(04d682+起始+LC);LC=明文数据长度+4。 RandApduDivData
  (字符型)其他为参数明文。起始不明是啥参数,其它明文参数不明白发送啥内容?
3)密文+MAC 参数更新函数中的 更新指令 10 位(04d6+文件标识+00+LC);(此处 LC 长度为下发密文数据+MAC 的长 度)RandApduDivData(字符型)其他为参数明文。文件标识和其它参数明文不清楚?
4)密钥更新函数中的4字节数据明文不明啥含义?
谢谢,
5)顺便问问两个独立应用程序如何同时调用TestZhuzhan.dll文件?

作者: ucyhboy   发布时间: 2011-12-15

希望得到大家的帮助,谢谢

作者: ucyhboy   发布时间: 2011-12-15