⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.cs

📁 C#的Mac验证码算法用于远程交互数据验证数据的有效性
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Security.Cryptography;
using System.IO;
using System.Runtime.InteropServices;

namespace WintecLib
{
    public class Mac
    {
        //MD5不可逆加密
        public static string Md5(string strPassword)
        {
            MD5CryptoServiceProvider hashmd5;
            hashmd5 = new MD5CryptoServiceProvider();
            return BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(strPassword))).Replace("-", "").ToLower();
        }
        
        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="Key">密钥</param>
        /// <param name="Data">数据</param>
        /// <returns>解密后的数据</returns>
        public static byte[] DESDecrypt(byte[] Key, byte[] Data)
        {

            try
            {
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();

                //计算des加密所采用的算法

                MyServiceProvider.Mode = CipherMode.CBC;

                //计算填充类型
                MyServiceProvider.Padding = PaddingMode.Zeros;

                ICryptoTransform MyTransform = MyServiceProvider.CreateDecryptor(Key, new byte[8] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 });
                //CryptoStream对象的作用是将数据流连接到加密转换的流
                MemoryStream ms = new MemoryStream();
                CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                //将字节数组中的数据写入到加密流中
                MyCryptoStream.Write(Data, 0, Data.Length);
                MyCryptoStream.FlushFinalBlock();
                MyCryptoStream.Close();
                byte[] byEncRet = ms.ToArray();
                ms.Close();
                return byEncRet;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught: {0}", ex.Message);
                return new byte[8];
            }



        }
        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="Key">密钥</param>
        /// <param name="Data">数据</param>
        /// <returns>加密后的数据</returns>
        public static byte[] DESEncrypt(byte[] Key, byte[] Data)
        {

            try
            {
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();

                //计算des加密所采用的算法

                MyServiceProvider.Mode = CipherMode.CBC;

                //计算填充类型
                MyServiceProvider.Padding = PaddingMode.Zeros;

                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key, new byte[8] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 });
                //CryptoStream对象的作用是将数据流连接到加密转换的流
                MemoryStream ms = new MemoryStream();
                CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                //将字节数组中的数据写入到加密流中
                MyCryptoStream.Write(Data, 0, Data.Length);
                MyCryptoStream.FlushFinalBlock();
                MyCryptoStream.Close();
                byte[] byEncRet = ms.ToArray();
                ms.Close();
                return byEncRet;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught: {0}", ex.Message);
                return new byte[8];
            }
        }

      



        /// <summary>
        /// 对异或后的8位数据进行加密,位数不足8位补0x0
        /// </summary>
        /// <param name="Key">密钥</param>
        /// <param name="Data">数据</param>
        /// <returns>加密后的数据</returns>
        public static byte[] HCDES(byte[] Key, byte[] Data)
        {
            try
            {
                //创建一个DES算法的加密类
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                MyServiceProvider.Mode = CipherMode.CBC;
                MyServiceProvider.Padding = PaddingMode.None;
                //从DES算法的加密类对象的CreateEncryptor方法,创建一个加密转换接口对象
                //第一个参数的含义是:对称算法的机密密钥(长度为64位,也就是8个字节)
                // 可以人工输入,也可以随机生成方法是:MyServiceProvider.GenerateKey();
                //第二个参数的含义是:对称算法的初始化向量(长度为64位,也就是8个字节)
                // 可以人工输入,也可以随机生成方法是:MyServiceProvider.GenerateIV()

                //
                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key,Key);// new byte[8] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 });

                //CryptoStream对象的作用是将数据流连接到加密转换的流
                MemoryStream ms = new MemoryStream();
                CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                //将字节数组中的数据写入到加密流中


                MyCryptoStream.Write(Data, 0, Data.Length);
                //关闭加密流对象
                byte[] bEncRet = new byte[8];
                // Array.Copy(ms.GetBuffer(), bEncRet, ms.Length);
                bEncRet = ms.ToArray(); // MyCryptoStream关闭之前ms.Length 为8, 关闭之后为16

                MyCryptoStream.FlushFinalBlock();
                MyCryptoStream.Close();
                byte[] bTmp = ms.ToArray();
                ms.Close();


                // return bEncRet;
                return bTmp;// 
            }
            catch (Exception ex)
            {
                Console.WriteLine("HCDES Exception Caught, Exception = {0}", ex.Message);
                return new byte[8];
            }

        }


        /// <summary>
        /// Mac验证码的数据生成讲数据分为8位1组进行异或后加密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="MacData">数据</param>
        /// <returns>加密后的Mac验证码</returns>
        public static byte[] MAC_CBC(byte[] key,byte[] MacData)
        {
            int count = 0;
            if (MacData.Length % 8 != 0)
            {
                count = 8 - (MacData.Length % 8);

            }

            byte[] tmpData = new byte[count];
            for (int index = 0; index < tmpData.Length; index++)
            {
                tmpData[index] = new byte[] { 0 }[0x30];
            }
            byte[] newMacData = new byte[MacData.Length + tmpData.Length];
            Array.Copy(MacData, 0, newMacData, 0, MacData.Length);
            Array.Copy(tmpData, 0, newMacData, MacData.Length, tmpData.Length);
            
            byte[] bKey=new byte[8];
           
            bKey=key;

            try
            {
                int iGroup = 0;

                byte[] bIV = new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
                byte[] bTmpBuf1 = new byte[8];
                byte[] bTmpBuf2 = new byte[8];

                Array.Copy(bIV, bTmpBuf1, 8);

                if ((newMacData.Length % 8 == 0))
                    iGroup = newMacData.Length / 8;
                else
                    iGroup = newMacData.Length / 8 + 1;

                int i = 0;
                int j = 0;

                for (i = 0; i < iGroup; i++)
                {
                    Array.Copy(newMacData, 8 * i, bTmpBuf2, 0, 8);
                    for (j = 0; j < 8; j++)
                        bTmpBuf1[j] = (byte)(bTmpBuf1[j] ^ bTmpBuf2[j]);
                   
                }
                bTmpBuf2 = HCDES(bKey, bTmpBuf1);
                
                return bTmpBuf2;
            }
            catch
            {
                return new byte[8];
            }
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -