我有一个16位的数据,首先要进行BCD压缩成8位,仍然后再做单DES加密。我的代码如下:        private void but_login_Click(object sender, EventArgs e)
        {
             string str = "8B0E5C4A224B15B1";
            if (str.Length % 2 == 1)
            {
                str = str + "0";
            }
            byte[] mybyte = new byte[str.Length / 2];
            byte[] mytbt = Encoding.ASCII.GetBytes(str);            for (int i = 0; i < mytbt.Length; i = i + 2)
            {
                int a = mytbt[i] % 16;
                int b = mytbt[i + 1] % 16;
                mybyte[i / 2] = Convert.ToByte((((byte)a) << 4) + (((byte)b)));
            }            byte[] test = HCDESHCDES(mybyte, Encoding.ASCII.GetBytes("1111111111111111"));
        }        public byte[] HCDES(byte[] Key, byte[] Data)
        {            //创建一个DES算法的加密类
            DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
            MyServiceProvider.Mode = CipherMode.CBC;
            MyServiceProvider.Padding = PaddingMode.None;
            ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key, new byte[8]);            //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;// 
        }
1.压缩后的结果是:
mybyte {维数:[8]} byte[]
[0] 130 byte
[1] 5 byte
[2] 83 byte
[3] 65 byte
[4] 34 byte
[5] 66 byte
[6] 21 byte
[7] 33 byte2.加密以后的结果是:
test {维数:[16]} byte[]
[0] 117 byte
[1] 106 byte
[2] 57 byte
[3] 6 byte
[4] 18 byte
[5] 97 byte
[6] 236 byte
[7] 116 byte
[8] 93 byte
[9] 226 byte
[10] 203 byte
[11] 52 byte
[12] 161 byte
[13] 12 byte
[14] 211 byte
[15] 207 byte
但是我用软件计算的结果是:F8E6027CAA34A909请问:
1.我的压缩和3DES这样写对不对。
2.我要向吧byte的压缩结果变成F8E6027CAA34A909。要怎么做?谢谢了,在线等!急!

解决方案 »

  1.   

    没有看清楚,要求结果为F8E6027CAA34A909: 要加密的数据是什么,密钥是多少,到底是要做单des还是3des啊?
      

  2.   


    要加密的数据是:1111111111111111
    密钥是:8B0E5C4A224B15B1压缩成BCD
    单DES
      

  3.   

    有分冒得,给点分撒。
    修改如下:
    private void but_login_Click(object sender, EventArgs e) 
            { 
                string str = "8B0E5C4A224B15B1"; 
                if (str.Length % 2 == 1) 
                { 
                    str = str + "0"; 
                } 
                byte[] mybyte = new byte[str.Length / 2]; 
                byte[] mytbt = Encoding.ASCII.GetBytes(str);             for (int i = 0; i < mytbt.Length; i = i + 2) 
                { 
                    int a = mytbt[i] % 16; 
                    int b = mytbt[i + 1] % 16; 
                    mybyte[i / 2] = Convert.ToByte((((byte)a) < < 4) + (((byte)b))); 
                }             byte[] test = HCDES(
                    new byte[] { 0x8B, 0x0E, 0x5C, 0x4A, 0x22, 0x4B, 0x15, 0xB1 },
                    new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
                    );         } 
      

  4.   

            private byte[] stringToBCD(string strdata)
            {
                string str = strdata;
                if (str.Length % 2 == 1)
                {
                    str = str + "0";
                }
                byte[] mybyte = new byte[str.Length / 2];
                byte[] mytbt = Encoding.ASCII.GetBytes(str);            for (int i = 0; i < mytbt.Length; i+=2 )
                {
                    byte a = mytbt[i] ;                
                    byte b = mytbt[i + 1] ;
                    
                    if (a >= 97) a -= 97 + 10; //a
                    else if (a >= 65) a -= 65-10; //A
                    else if (a >= 48) a -= 48; //0                if (b >= 97) b -= 97 + 10; //a
                    else if (b >= 65) b -= 65-10; //A
                    else if (b >= 48) b -= 48; //0                mybyte[i / 2] = Convert.ToByte(  (a << 4)+ b  );
                }
                return mybyte;
            }        private void but_login_Click() 
            {
                byte[] result = stringToBCD("8B0E5C4A224B15B1");            byte[] test = HCDES(
                    stringToBCD("8B0E5C4A224B15B1"),
                    stringToBCD("1111111111111111")
                    //new byte[] { 0x8B, 0x0E, 0x5C, 0x4A, 0x22, 0x4B, 0x15, 0xB1 },
                    //new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
                    ); 
            }
      

  5.   

            
    解决了,终于解决了,感谢小狼。哈哈
            /// <summary>
            /// BCD转换
            /// </summary>
            /// <param name="hexString">转换字段</param>
            /// <returns></returns>
            public byte[] HexStringToByte(string hexString)
            {
                byte[] byteResult = new byte[hexString.Length / 2];
                for (int i = 0; i < hexString.Length / 2; i++)
                {
                    byteResult[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                }
                return byteResult;
            }         /// <summary>
            /// DES加密
            /// </summary>
            /// <param name="sKey">密钥</param>
            /// <param name="sDate">需要加密的数据</param>
            /// <returns></returns>
            public string DesEncrypt(string sKey, string sDate)
            {
                byte[] Key = HexStringToByte(sKey);
                byte[] Data = HexStringToByte(sDate);
                //创建一个DES算法的加密类
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                MyServiceProvider.Mode = CipherMode.CBC;
                MyServiceProvider.Padding = PaddingMode.None;
                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key, new byte[8]);            //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();            //转换成16进制
                string sReturn = "";
                for (int i = 0; i < bTmp.Length; i++)
                {
                    sReturn = sReturn + AcceptConvertString(bTmp[i].ToString("D2"), 10, 16);
                }
                return sReturn;        }        /// <summary>
            /// 进制转换函数
            /// </summary>
            /// <param name="value">需要转换的数据</param>
            /// <param name="fromBase">转换前进制</param>
            /// <param name="toBase">转换后进制</param>
            /// <returns></returns>
            public string AcceptConvertString(string value, int fromBase, int toBase)
            {
                int intValue = Convert.ToInt32(value, fromBase);            string S_ConvertString = Convert.ToString(intValue, toBase);
                if (intValue < 10)
                {
                    S_ConvertString = Convert.ToInt32(S_ConvertString).ToString("D2");
                }
                //
                S_ConvertString = S_ConvertString.ToUpper();
                return S_ConvertString;
            }
    调用:
                string str = "8B0E5C4A224B15B1";
                string test = encrypt.DesEncrypt(str, "1111111111111111");结果:F8E6027CAA34A909