Exemple #1
0
        // 查询本机是否安装加密狗
        public bool FindDog(out string msg)
        {
            msg = string.Empty;
            byte[] bytPID = new byte[8];
            int    count  = 0;

            bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID_Default);
            uint result = ET99_API.et_FindToken(bytPID, out count);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg     = "检测到加密狗--新狗";
                dogFlag = Dog_Flag.新狗;
                DoThreadSafe(() => { toolStripProgressBar1.Maximum = 16; });//新狗分为16个步骤
                return(true);
            }
            else
            {
                bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID);
                result = ET99_API.et_FindToken(bytPID, out count);
                if (result == ET99_API.ET_SUCCESS)
                {
                    msg     = "检测到加密狗--旧狗";
                    dogFlag = Dog_Flag.旧狗;
                    DoThreadSafe(() => { toolStripProgressBar1.Maximum = 14; });//旧狗分为14个步骤
                    return(true);
                }
                msg = string.Format("系统未检测到加密狗,请检查!错误:{0}",
                                    ET99_API.ShowResultText(result));
                return(false);
            }
        }
Exemple #2
0
        //设置设备参数
        public bool SetConfig(out string msg)
        {
            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            byte bytUserReadOnly   = ET99_API.ET_USER_READ_ONLY;//设置为只读模式
            byte bytSoPinRetries   = byte.Parse(Properties.Resources.SOPIN重试次数);
            byte bytUserPinRetries = byte.Parse(Properties.Resources.UserPIN重试次数);
            byte bytBack           = 0;


            uint result = ET99_API.et_SetupToken(ET99_API.dogHandle, bytSoPinRetries, bytUserPinRetries, bytUserReadOnly, bytBack);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "设备参数设置成功!";
                return(true);
            }
            else
            {
                msg = "设备参数设置失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #3
0
        /// <summary>
        /// 闪烁LED灯n次
        /// </summary>
        /// <param name="times">闪烁次数</param>
        /// <param name="interval">间隔毫秒数,300貌似不错</param>
        public void FlashLED(int times, int interval)
        {
            int count = 0;

            System.Timers.Timer turnOffTimer = new System.Timers.Timer(interval);
            turnOffTimer.AutoReset = false;
            System.Timers.Timer turnOnTimer = new System.Timers.Timer(interval);
            turnOnTimer.AutoReset = false;
            turnOffTimer.Elapsed += new System.Timers.ElapsedEventHandler((m, n) =>
            {
                ET99_API.et_TurnOffLED(ET99_API.dogHandle);
                turnOnTimer.Start();
            });
            turnOnTimer.Elapsed += new System.Timers.ElapsedEventHandler((m, n) =>
            {
                count++;
                ET99_API.et_TurnOnLED(ET99_API.dogHandle);
                if (count < times)
                {
                    turnOffTimer.Start();
                }
            });

            turnOffTimer.Start();
        }
Exemple #4
0
        // 打开加密狗
        public bool OpenDog(out string msg)
        {
            msg = string.Empty;
            int index = 1;//默认仅打开第一个加密狗

            byte[] bytPID = new byte[8];
            if (dogFlag == Dog_Flag.新狗)
            {
                bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID_Default);
            }
            else
            {
                bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID);
            }
            uint result = ET99_API.et_OpenToken(ref ET99_API.dogHandle, bytPID, index);

            if (result == ET99_API.ET_SUCCESS)//打开成功
            {
                msg = "打开加密狗成功。";
                return(true);
            }
            else
            {
                msg = string.Format("打开加密狗失败,请检查!错误:{0}",
                                    ET99_API.ShowResultText(result));
                return(false);
            }
        }
Exemple #5
0
        //修改普通用户的PIN
        public bool ModifyUserPin(out string msg)
        {
            string strOldUserPin = Properties.Resources.UserPIN_Default;

            byte[] bytOldUserPin = new byte[16];
            string strNewUserPin = Properties.Resources.UserPIN;

            byte[] bytNewUserPin = new byte[16];

            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            bytOldUserPin = System.Text.Encoding.ASCII.GetBytes(strOldUserPin);
            bytNewUserPin = System.Text.Encoding.ASCII.GetBytes(strNewUserPin);
            uint result = ET99_API.et_ChangeUserPIN(ET99_API.dogHandle, bytOldUserPin, bytNewUserPin);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "普通用户PIN修改成功!进入普通用户状态。";
                return(true);
            }
            else
            {
                msg = "普通用户PIN修改失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #6
0
        //产生新的超级用户PIN(针对新狗)
        public bool GenSoPin(out string msg)
        {
            string strSeed = Properties.Resources.SOPIN种子;

            byte[] bytSeed;
            int    iSeedLen = strSeed.Length;

            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            StringBuilder strNewPIN = new StringBuilder();

            bytSeed = System.Text.Encoding.ASCII.GetBytes(strSeed);
            uint result = ET99_API.et_GenSOPIN(ET99_API.dogHandle, iSeedLen, bytSeed, strNewPIN);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "成功产生新的超级用户PIN!请牢记 -- " + strNewPIN.ToString().Trim().Substring(0, 16);
                return(true);
            }
            else
            {
                msg = "产生新的超级用户PIN失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #7
0
        //重置普通用户PIN为 ffffffffffffffff
        public bool ResetUserPin(out string msg)
        {
            string strSoPIN = Properties.Resources.SOPIN;

            byte[] bytPIN = new byte[16];

            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            bytPIN = System.Text.Encoding.ASCII.GetBytes(strSoPIN);
            uint result = ET99_API.et_ResetPIN(ET99_API.dogHandle, bytPIN);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "重置普通用户PIN为 FFFFFFFFFFFFFFFF 成功!";
                return(true);
            }
            else
            {
                msg = "重置普通用户PIN失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #8
0
        //产生新的PID(针对新狗)
        public bool GenPID(out string msg)
        {
            string strSeed = Properties.Resources.PID种子;

            byte[] bytSeed;
            int    iSeedLen = strSeed.Length;

            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            StringBuilder strNewPID = new StringBuilder();

            bytSeed = System.Text.Encoding.ASCII.GetBytes(strSeed);
            uint result = ET99_API.et_GenPID(ET99_API.dogHandle, iSeedLen, bytSeed, strNewPID);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "成功写入新的PID到当前设备中! -- " + strNewPID.ToString().Trim().Substring(0, 8);
                return(true);
            }
            else
            {
                msg = "写入新的PID到当前设备失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #9
0
        //获取硬件SN
        public bool GetSN(out string msg)
        {
            byte[] bytSN = new byte[8];

            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            uint result = ET99_API.et_GetSN(ET99_API.dogHandle, bytSN);

            if (result == ET99_API.ET_SUCCESS)
            {
                string strSN = "";
                for (int i = 0; i < 8; ++i)
                {
                    strSN += string.Format("{0:X2}", bytSN[i]);
                }

                msg   = "获取硬件SN成功!-- " + strSN;
                dogSN = strSN;
                return(true);
            }
            else
            {
                msg = "获取硬件SN失败!错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #10
0
        // 校验加密狗,进入超级用户状态
        public bool VerifyDog(out string msg)
        {
            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            byte[] bytPIN = new byte[16];
            if (dogFlag == Dog_Flag.新狗)
            {
                bytPIN = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.SOPIN_Default);
            }
            else
            {
                bytPIN = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.SOPIN);
            }
            uint result = ET99_API.et_Verify(ET99_API.dogHandle, ET99_API.ET_VERIFY_SOPIN, bytPIN);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "加密狗认证成功,进入超级用户状态。";
                return(true);
            }
            else
            {
                msg = string.Format("加密狗认证失败,请检查!错误:{0}",
                                    ET99_API.ShowResultText(result));
                return(false);
            }
        }
Exemple #11
0
        /// <summary>
        /// 硬件加密狗计算HMAC_MD5
        /// </summary>
        /// <param name="MD5KeyIndexInDog">密钥index[范围1~8,对应加密狗中密钥存储范围1~8]</param>
        /// <param name="origin">原始字串</param>
        /// <returns>加密后字串</returns>
        public string HMAC_MD5_dog(int MD5KeyIndexInDog, string origin)
        {
            byte[] bytRandomCode = new byte[origin.Length]; //第四个参数为随机数
            bytRandomCode = System.Text.Encoding.ASCII.GetBytes(origin);
            byte[] bytDigest = new byte[16];                //第五个参数为硬件中计算结果

            //硬件中计算
            //第一个参数为设备的handle句柄
            //第二个参数为硬件中密钥索引
            //第三个参数为随机数长度
            //第四个参数为随机数
            //第五个参数为硬件中计算结果
            uint result = ET99_API.et_HMAC_MD5(ET99_API.dogHandle, MD5KeyIndexInDog, origin.Length, bytRandomCode, bytDigest);

            if (result == ET99_API.ET_SUCCESS)
            {
                //string strSoftDigest = string.Empty;
                //for (int i = 0; i < 16; i++)
                //    strSoftDigest += string.Format("{0:X2}", bytDigest[i]);
                //return strSoftDigest;
                return(System.Text.Encoding.Default.GetString(bytDigest));
            }
            else//失败
            {
                return("硬件中计算失败");
            }
        }
Exemple #12
0
        //完全清空数据区
        public bool ClearData(out string msg)
        {
            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            //就是将锁内的数据区全部写成0x00
            byte[] zerodata   = new byte[50]; //1000字节每次写50个字节,循环20次
            uint   resultmess = 0;
            int    i          = 0;

            for (i = 0; i < 50; ++i)
            {
                zerodata[i] = 0x00;
            }

            for (i = 0; i < 20; ++i)
            {
                resultmess = ET99_API.et_Write(ET99_API.dogHandle, (ushort)(i * 50), 50, zerodata);
                if (resultmess != ET99_API.ET_SUCCESS)
                {
                    msg = "清空数据区失败!";
                    return(false);
                }
            }
            msg = "成功清空数据区!";
            return(true);
        }
Exemple #13
0
        /// <summary>
        /// 读取指定地址数据区的字符串
        /// </summary>
        /// <param name="str">指定地址数据区的字符串</param>
        /// <param name="offset">偏移地址,范围0~999,字节为单位(整个数据区1000字节,每次读写限制长度60字节)</param>
        /// <param name="length">欲读取的字节长度</param>
        /// <param name="msg">成功与否详细信息</param>
        /// <returns>是否成功</returns>
        public bool ReadDataFromDog(out string str, int offset, int length, out string msg)
        {
            str = string.Empty;
            msg = "读取数据成功";
            byte[] zyn = new byte[length];
            //校验从偏移地址开始,欲写入的字节长度是否超过999
            if (offset + length > 1000)
            {
                msg = "从偏移地址开始,欲读取的字节长度超出数据区范围(整个数据区1000字节)!";
                return(false);
            }
            uint resultmess;

            while (length > 60)
            {
                byte[] temp = new byte[60];
                resultmess = ET99_API.et_Read(ET99_API.dogHandle, (ushort)offset, 60, temp);//读取60字节
                if (resultmess != ET99_API.ET_SUCCESS)
                {
                    msg = "其他错误";
                    if (resultmess == ET99_API.ET_HARD_ERROR)
                    {
                        msg = "硬件错误!";
                    }
                    if (resultmess == ET99_API.ET_ACCESS_DENY)
                    {
                        msg = "权限不够!";
                    }
                    return(false);
                }
                Array.Copy(temp, 0, zyn, zyn.Length - length, 60);
                offset += 60;
                length -= 60;
            }
            //剩余数据,不需分割
            byte[] others = new byte[length];
            resultmess = ET99_API.et_Read(ET99_API.dogHandle, (ushort)offset, length, others);//读取
            if (resultmess != ET99_API.ET_SUCCESS)
            {
                msg = "其他错误";
                if (resultmess == ET99_API.ET_HARD_ERROR)
                {
                    msg = "硬件错误!";
                }
                if (resultmess == ET99_API.ET_ACCESS_DENY)
                {
                    msg = "权限不够!";
                }
                return(false);
            }
            Array.Copy(others, 0, zyn, zyn.Length - length, length);
            //转化成字符串
            str = System.Text.Encoding.Default.GetString(zyn);
            return(true);
        }
Exemple #14
0
        /// <summary>
        /// 将字符串写入指定地址的数据区
        /// </summary>
        /// <param name="origin">欲写入的字符串</param>
        /// <param name="offset">偏移地址,范围0~999,字节为单位(整个数据区1000字节,每次读写限制长度60字节)</param>
        /// <param name="msg">成功与否详细信息</param>
        /// <returns>是否成功</returns>
        public bool WriteDataToDog(string origin, int offset, out string msg)
        {
            msg = "写入数据成功";
            byte[] zyn = System.Text.Encoding.Default.GetBytes(origin);
            //校验从偏移地址开始,欲写入的字节长度是否超过999
            if (offset + zyn.Length > 1000)
            {
                msg = "从偏移地址开始,欲写入的字节长度超出数据区范围(整个数据区1000字节)!";
                return(false);
            }
            uint resultmess;

            while (zyn.Length > 60)
            {
                byte[] temp = new byte[60];
                Array.Copy(zyn, 0, temp, 0, 60);                                              //拷贝60字节数据
                byte[] others = new byte[zyn.Length - 60];
                Array.Copy(zyn, 60, others, 0, zyn.Length - 60);                              //拷贝剩余数据
                zyn = others;                                                                 //zyn赋值为剩余数据

                resultmess = ET99_API.et_Write(ET99_API.dogHandle, (ushort)offset, 60, temp); // 传入值
                if (resultmess != ET99_API.ET_SUCCESS)
                {
                    msg = "其他错误";
                    if (resultmess == ET99_API.ET_HARD_ERROR)
                    {
                        msg = "硬件错误!";
                    }
                    if (resultmess == ET99_API.ET_ACCESS_DENY)
                    {
                        msg = "权限不够!";
                    }
                    return(false);
                }
                offset += 60;//更新偏移值
            }
            //剩余数据,不需分割
            resultmess = ET99_API.et_Write(ET99_API.dogHandle, (ushort)offset, zyn.Length, zyn);// 传入值
            if (resultmess != ET99_API.ET_SUCCESS)
            {
                msg = "其他错误";
                if (resultmess == ET99_API.ET_HARD_ERROR)
                {
                    msg = "硬件错误!";
                }
                if (resultmess == ET99_API.ET_ACCESS_DENY)
                {
                    msg = "权限不够!";
                }
                return(false);
            }

            return(true);
        }
Exemple #15
0
        /// <summary>
        /// 读取指定地址数据区的字符串,并解密。
        /// </summary>
        /// <param name="offset">偏移地址,范围0~999,字节为单位(整个数据区1000字节,每次读写限制长度60字节)</param>
        /// <param name="length">欲读取的字节长度</param>
        /// <returns></returns>
        public string ReadOffsetDataAndDecrypt(int offset, int length)
        {
            string str = string.Empty;

            byte[] zyn = new byte[length];

            uint resultmess;

            while (length > 60)
            {
                byte[] temp = new byte[60];
                resultmess = ET99_API.et_Read(ET99_API.dogHandle, (ushort)offset, 60, temp);//读取60字节
                if (resultmess != ET99_API.ET_SUCCESS)
                {
                    //ComponentFactory.Krypton.Toolkit.KryptonMessageBox.Show("加密狗数据错误!", "错误",
                    //    System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                    //System.Windows.Forms.Application.Exit();
                    return(string.Format("加密狗读取失败。偏移:{0},长度:{1}", offset, length));
                }
                Array.Copy(temp, 0, zyn, zyn.Length - length, 60);
                offset += 60;
                length -= 60;
            }
            //剩余数据,不需分割
            byte[] others = new byte[length];
            resultmess = ET99_API.et_Read(ET99_API.dogHandle, (ushort)offset, length, others);//读取
            if (resultmess != ET99_API.ET_SUCCESS)
            {
                //ComponentFactory.Krypton.Toolkit.KryptonMessageBox.Show("加密狗数据错误!", "错误",
                //        System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                //System.Windows.Forms.Application.Exit();
                return(string.Format("加密狗读取失败。偏移:{0},长度:{1}", offset, length));
            }
            Array.Copy(others, 0, zyn, zyn.Length - length, length);
            //转化成字符串
            str = System.Text.Encoding.Default.GetString(zyn);
            if (string.IsNullOrWhiteSpace(str.Replace('\0', ' ')))
            {
                return(string.Empty);//类似加密狗初期没有的数据‘起始时间’等,直接返回空。
            }
            //======解密
            int    intRandom = new Random().Next(1, 9);//随即取1~8
            string key16     = HMAC_MD5_dog(intRandom, "武汉创方科技");

            return(系统使用的加解密算法.RC2Decrypt(str, key16));
        }
Exemple #16
0
        // 关闭加密狗
        public bool CloseDog(out string msg)
        {
            msg = string.Empty;
            uint result = ET99_API.et_CloseToken(ET99_API.dogHandle);

            if (result == ET99_API.ET_SUCCESS)
            {
                ET99_API.dogHandle = System.IntPtr.Zero;
                msg = "成功关闭加密狗";
                return(true);
            }
            else
            {
                msg = string.Format("关闭加密狗失败,请检查!错误:{0}",
                                    ET99_API.ShowResultText(result));
                return(false);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int index = 1;//默认仅打开第一个加密狗

            byte[] bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID);
            uint   result = ET99_API.et_OpenToken(ref ET99_API.dogHandle, bytPID, index);

            //------------
            byte[] bytPIN = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.SOPIN);
            result = ET99_API.et_Verify(ET99_API.dogHandle, ET99_API.ET_VERIFY_SOPIN, bytPIN);
            if (result == ET99_API.ET_SUCCESS)
            {
                MessageBox.Show("加密狗认证成功,进入超级用户状态。");
            }
            else
            {
                MessageBox.Show("加密狗认证失败,请检查!错误:{0}",
                                ET99_API.ShowResultText(result));
            }
        }
Exemple #18
0
        //设置8个MD5校验密匙
        public bool SetMd5Key(out string msg)
        {
            msg = string.Empty;
            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            string strMd5Key = Properties.Resources.HMAC_MD5;//需要写入的KEY

            byte[] bytShortKey = System.Text.Encoding.ASCII.GetBytes(strMd5Key);
            for (int keyid = 1; keyid <= 8; keyid++)//循环写入Md5Key
            {
                byte[] randombuffer = new byte[51];
                byte   keylen       = byte.Parse(strMd5Key.Length.ToString());
                byte   randomlen    = 51;

                byte[] sbMd5Key = new byte[32];
                byte[] sbdigest = new byte[16];

                //第一个参数是随机数,在设置密钥时没有作用
                //第二个参数是随机数长度,在设置密钥时没有作用
                //第三个参数是分配给客户的密钥
                //第四个参数是分配给客户的密钥的长度
                //第五个参数是返回的32字节的密钥,用于存到锁内
                //第六个参数在设置密钥时没有作用
                uint result = ET99_API.MD5_HMAC(randombuffer, randomlen, bytShortKey, keylen, sbMd5Key, sbdigest);
                result = ET99_API.et_SetKey(ET99_API.dogHandle, keyid, sbMd5Key);
                if (result == ET99_API.ET_SUCCESS)
                {
                    msg = "设置8个MD5校验密匙成功!";
                }
                else
                {
                    msg = string.Format("设置第{0}个MD5校验密匙失败!错误:{1}", keyid, ET99_API.ShowResultText(result));
                    return(false);
                }
            }
            return(true);
        }
Exemple #19
0
        //关闭LED
        public bool CloseLED(out string msg)
        {
            if (ET99_API.dogHandle == System.IntPtr.Zero)
            {
                msg = "请先打开设备!";
                return(false);
            }

            uint result = ET99_API.et_TurnOffLED(ET99_API.dogHandle);

            if (result == ET99_API.ET_SUCCESS)
            {
                msg = "关闭LED成功!";
                return(true);
            }
            else
            {
                msg = "关闭LED失败! 错误:" + ET99_API.ShowResultText(result);
                return(false);
            }
        }
Exemple #20
0
        /// <summary>
        /// 软件计算HMAC_MD5
        /// 加密狗中可存储8个32字节HMAC_MD5密钥(每一个密钥都是由1个16字节密钥种子重复一次而成,这里存储的是8个16字节‘密钥种子’)
        /// </summary>
        /// <param name="MD5KeyIndexInDog">密钥index[范围1~8,对应加密狗中密钥存储范围1~8]</param>
        /// <param name="origin">原始字串</param>
        /// <returns>加密后字串</returns>
        public string HMAC_MD5_soft(int MD5KeyIndexInDog, string origin)
        {
            string strMD5Key = Properties.Resources.HMAC_MD5;

            byte[] bytRandomCode = new byte[origin.Length];        //第一个参数是随机数
            bytRandomCode = System.Text.Encoding.ASCII.GetBytes(origin);
            byte randomlen = byte.Parse(origin.Length.ToString()); //第二个参数是随机数长度

            byte[] bytShortKey = new byte[strMD5Key.Length];       //第三个参数是分配给客户的密钥
            bytShortKey = System.Text.Encoding.ASCII.GetBytes(strMD5Key);
            byte keylen = byte.Parse(strMD5Key.Length.ToString()); //第四个参数是分配给客户的密钥的长度

            byte[] sbMd5Key = new byte[32];                        //第五个参数没有作用
            byte[] sbdigest = new byte[16];                        //第六个参数为软件计算的结果

            //第一个参数是随机数
            //第二个参数是随机数长度
            //第三个参数是分配给客户的密钥
            //第四个参数是分配给客户的密钥的长度
            //第五个参数没有作用
            //第六个参数为软件计算的结果
            uint result = ET99_API.MD5_HMAC(bytRandomCode, randomlen, bytShortKey, keylen, sbMd5Key, sbdigest);

            if (result == ET99_API.ET_SUCCESS)
            {
                //string strSoftDigest = string.Empty;
                //for (int i = 0; i < 16; i++)
                //    strSoftDigest += string.Format("{0:X2}", sbdigest[i]);
                //return strSoftDigest;
                return(System.Text.Encoding.Default.GetString(sbdigest));
            }
            else//失败
            {
                return("软件计算失败");
            }
        }