none
关于3DES的解密 RRS feed

  • 问题

  • 这是一个URL带的参数UserInfo=1077%24%2BJ%2FRjyQsqLIqG0YeL%2FxDcBevsYti%

    2FoBlmjPAYlaH4w8tfXOBt62wIg2fshfFfZIsKVvAdyVg1mAYAPy3KCkT85DhA4PaLxHP


    密钥:123456781234567812345678;


    服务商的加密公式为URLEncoding(Base64(Encrypt(str))),str即为需加密的字符串;

    我在网上搜了挺多资料,关于c#对3DES的加密与解密,但是在调试的时候都出现了错误,比如:

    1.指定密钥是TripleDES的已知弱密钥,不能使用

    2.Base-64 字符串中的无效字符。

    不知道为什么,我脑袋都大了,不知道怎么解密,请各位老师帮忙看看。
    2009年7月1日 8:28

答案

  • using System;
    
    using System.Text;
    
    using System.Security.Cryptography;
    
    using System.IO;
    
    
    
    namespace X.Library
    
    {
    
      /// <summary>
    
      /// 标题:字符串加密解密
    
      /// 作者:X.X.Y
    
      /// 日期:2009-05-02 00:09:00
    
      /// 描述:
    
      /// </summary>
    
      public class StringCrypto
    
      {
    
        private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    
        /// <summary>
    
        /// 使用指定的密钥加密字符串
    
        /// </summary>
    
        /// <param name="fKey">密钥</param>
    
        /// <param name="fValue">将要加密的字符串</param>
    
        /// <returns>加密后的字符串</returns>
    
        public static String Encrypt(String fKey, String fValue)
    
        {
    
          byte[] tKey = Encoding.UTF8.GetBytes(BuildKey( fKey));
    
          byte[] tIV = IV;
    
          byte[] tValue = Encoding.UTF8.GetBytes(fValue);
    
          try
    
          {
    
            using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())
    
            {
    
              MemoryStream fMemoryStream = new MemoryStream();
    
              using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, desc.CreateEncryptor(tKey, tIV), CryptoStreamMode.Write))
    
              {
    
                fCryptoStream.Write(tValue, 0, tValue.Length);
    
                fCryptoStream.FlushFinalBlock();
    
                return Convert.ToBase64String(fMemoryStream.ToArray());
    
              }
    
            }
    
          }
    
          catch
    
          {
    
            return string.Empty;
    
          }
    
        }
    
    
    
        /// <summary>
    
        /// 使用指定的密钥解密字符串
    
        /// </summary>
    
        /// <param name="fKey">密钥</param>
    
        /// <param name="fValue">将要解密的字符串</param>
    
        /// <returns>解密后的字符串</returns>
    
        public static String Decrypt(String fKey, String fValue)
    
        {
    
          try
    
          {
    
            byte[] tKey = Encoding.UTF8.GetBytes(BuildKey(fKey));
    
            byte[] tIV = IV;
    
            byte[] tValue = Convert.FromBase64String(fValue);
    
            using (DESCryptoServiceProvider fServiceProvider = new DESCryptoServiceProvider())
    
            {
    
              MemoryStream fMemoryStream = new MemoryStream();
    
              using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, fServiceProvider.CreateDecryptor(tKey, tIV), CryptoStreamMode.Write))
    
              {
    
                fCryptoStream.Write(tValue, 0, tValue.Length);
    
                fCryptoStream.FlushFinalBlock();
    
                return Encoding.UTF8.GetString(fMemoryStream.ToArray());
    
              }
    
            }
    
          }
    
          catch
    
          {
    
            return string.Empty;
    
          }
    
        }
    
    
    
        private static String BuildKey(String fKey)
    
        {
    
          if (String.IsNullOrEmpty(fKey)) 
    
            fKey = "Y09M05#X";
    
          else if (fKey.Length < 8) 
    
            fKey = fKey.PadRight(8, 'X');
    
          else if (fKey.Length > 8) 
    
            fKey = fKey.Substring(0, 8);
    
          return fKey;
    
        }
    
      }
    
    }
    
    
    
    

    知识改变命运,奋斗成就人生!

    问题在这一句:
    using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())

    这不是3Des加密算法,是Des加密算法,DES的加密算法,密匙长度是64,也就是只能使用8字节作为密钥。

    换成:
    using (TripleDESCryptoServiceProvider desc = new TripleDESCryptoServiceProvider())

    再使用desc.KeySize =128(16字节),192(24字节),KeySize的范围是128-192


    天行健,君子当自强不息!
    2010年12月8日 9:00

全部回复

  • private void LoadUI()
            {
                string key = "123456781234567812345678";
                string url_now = "1023%24sxFi1ZA8DLMI5z1CDD3yWEZTv%2FHm1V9FV5DzZ5%2B5S9SWzKY%2BEM4zsbXLjeesIsr5xYua0a0cBUWtFxXweiXdvCIKyUwNssHS";
    
                TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
    
                DES.Key = Encoding.UTF8.GetBytes(key);
                DES.Mode = CipherMode.ECB;
                ICryptoTransform DESDecrypt = DES.CreateDecryptor();
    
                byte[] Buffer = Convert.FromBase64String(url_now);
                txturl.Text = UTF8Encoding.UTF8.GetString( DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length) );
    
            }
    这是我用的第一个方法,抛出异常:指定密钥是TripleDES的已知弱密钥,不能使用
    但问题是,服务商的密钥就是这样的啊。。。
    2009年7月1日 8:36
  • byte[] valBytes = Convert.FromBase64String(url_now);

    另外这句会报错:Base-64 字符串中的无效字符。


    2009年7月1日 8:37
  • using System;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    
    namespace X.Library
    {
        /// <summary>
        /// 标题:字符串加密解密
        /// 作者:X.X.Y
        /// 日期:2009-05-02 00:09:00
        /// 描述:
        /// </summary>
        public class StringCrypto
        {
            private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            /// <summary>
            /// 使用指定的密钥加密字符串
            /// </summary>
            /// <param name="fKey">密钥</param>
            /// <param name="fValue">将要加密的字符串</param>
            /// <returns>加密后的字符串</returns>
            public static String Encrypt(String fKey, String fValue)
            {
                byte[] tKey = Encoding.UTF8.GetBytes(BuildKey( fKey));
                byte[] tIV = IV;
                byte[] tValue = Encoding.UTF8.GetBytes(fValue);
                try
                {
                    using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())
                    {
                        MemoryStream fMemoryStream = new MemoryStream();
                        using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, desc.CreateEncryptor(tKey, tIV), CryptoStreamMode.Write))
                        {
                            fCryptoStream.Write(tValue, 0, tValue.Length);
                            fCryptoStream.FlushFinalBlock();
                            return Convert.ToBase64String(fMemoryStream.ToArray());
                        }
                    }
                }
                catch
                {
                    return string.Empty;
                }
            }
    
            /// <summary>
            /// 使用指定的密钥解密字符串
            /// </summary>
            /// <param name="fKey">密钥</param>
            /// <param name="fValue">将要解密的字符串</param>
            /// <returns>解密后的字符串</returns>
            public static String Decrypt(String fKey, String fValue)
            {
                try
                {
                    byte[] tKey = Encoding.UTF8.GetBytes(BuildKey(fKey));
                    byte[] tIV = IV;
                    byte[] tValue = Convert.FromBase64String(fValue);
                    using (DESCryptoServiceProvider fServiceProvider = new DESCryptoServiceProvider())
                    {
                        MemoryStream fMemoryStream = new MemoryStream();
                        using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, fServiceProvider.CreateDecryptor(tKey, tIV), CryptoStreamMode.Write))
                        {
                            fCryptoStream.Write(tValue, 0, tValue.Length);
                            fCryptoStream.FlushFinalBlock();
                            return Encoding.UTF8.GetString(fMemoryStream.ToArray());
                        }
                    }
                }
                catch
                {
                    return string.Empty;
                }
            }
    
            private static String BuildKey(String fKey)
            {
                if (String.IsNullOrEmpty(fKey)) 
                    fKey = "Y09M05#X";
                else if (fKey.Length < 8) 
                    fKey = fKey.PadRight(8, 'X');
                else if (fKey.Length > 8) 
                    fKey = fKey.Substring(0, 8);
                return fKey;
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    2009年7月1日 11:52
    版主
  • // 调用
    string fKey = "{076EF00B-59A2-4B4A-9338-2D80B9B0FFA9}"; //密钥
    string fSourceValue = "这是一个将要加密的字符串"; //将要加密的字符串
    string fValue1 = StringCrypto.Encrypt(fKey, fSourceValue); //获取加密后的字符串
    string fValue2 = StringCrypto.Decrypt(fKey, fValue1); //解密字符串

    知识改变命运,奋斗成就人生!
    2009年7月1日 11:53
    版主
  • 非常感谢XXY提供的代码,但现在有如下两个问题:
    1.我在1楼提供的字符串依然不能正常解密,总是会出“不是BASE64有效字符”的异常
    2.厂商提供的密钥是24位的,可是在XXY提供的BUILDKEY这个方法中把密钥截成8位,这是为什么?

    另外我补充一下厂商提供的加密方式:

    digest=Base64(Hash(str));

    其中Hash算法采用SHA-1,
    userinfo=URLEncoding(id+"$"+Base64(Encrypt(str+digest)))
    我解释一下,其中digest是不可解密的,在str被解密出来之后,再按照Base64(Hash(str))这个加密方式对str进行加密,之后与digest进行比较,如果相等就可以通过验证。

    这样的话应该如何解密呢?请各位老师帮忙再看看,非常感谢。
    2009年7月2日 1:14
  • 你好,能否提供一个加密前后正确的字符串?
    知识改变命运,奋斗成就人生!
    2009年7月2日 1:44
    版主
  • 以下是我管网通技术要的字符串:

    加密前数据: admin$getest001$1152862200$1187588100

    加密编码后的结果: 1023%24sxFi1ZA8DLMI5z1CDD3yWEZTv%2FHm1V9FV5DzZ5%2B5S9SWzKY%2BEM4zsbXLjeesIsr5xYua0a0cBUWtFxXweiXdvCIKyUwNssHS

    解密解码后的结果:1023$admin$getest001$1152862200$1187588100

    我解释一下,1023是一个ID编号,我上面也提到了加密公式,这个编号是不被加密的,但是会出现在字符串当中。再次感谢XXY

    2009年7月2日 1:49
  • 可能需要先对URL进行解码,然后再解密
    2009年7月2日 6:21
  • 现在调试的时候抛出异常:不正确的数据。。。
    2009年7月3日 1:01
  • 你好,

    请看一下SymmetricAlgorithm. GenerateKey方法,为什么不用这个静态方法生成密匙呢。还有 调用以下SymmetricAlgorithm. ValidKeySize方法去判断一下是否你给出的密匙对当前的算法是有效的。这个类是TripleDES的基类。

    看下这个VB.NET的例子是如何设置Private Key的。

    使用下面的工具得到C#代码:
    http://www.developerfusion.com/tools/convert/vb-to-csharp/


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年7月3日 6:28
    版主
  • 你好,

    请看一下SymmetricAlgorithm. GenerateKey方法,为什么不用这个静态方法生成密匙呢。还有 调用以下SymmetricAlgorithm. ValidKeySize方法去判断一下是否你给出的密匙对当前的算法是有效的。这个类是TripleDES的基类。

    看下这个VB.NET的例子是如何设置Private Key的。

    使用下面的工具得到C#代码:
    http://www.developerfusion.com/tools/convert/vb-to-csharp/


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    因为密钥是网通服务商给我的,难道说密钥不用服务商提供给我的也不耽误加密解密吗? 现在异常已经不是密钥产生的了,而是解密时DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)这个方法带出“不正确数据”的异常。不过还是感谢您的回答。
    2009年7月3日 7:21
  • 昨天尝试了几种方式都未能得到正确的加密结果,好像是Key不对。产商的加密是不是 JAVA 做的是否给你供了源代码?
    知识改变命运,奋斗成就人生!
    2009年7月4日 9:00
    版主
  • 的确,厂商的加密是JAVA做的,但是他说不管是哪种语言,加密解密算法都是通用的。他提供的代码比较少,我还是贴下吧,零零散散的。

    /**  
    	 *  3DES解密.  
    	 */
    	private static final String CRYPT_ALGORITHM = "DESede"; 
    	private static byte[] desDecrypt( byte[] crypt,String key) 
    		throws Exception { 
    		
    		SecretKey secretKey = genDESKey(key.getBytes());
    		Cipher cipher = javax.crypto.Cipher.getInstance(CRYPT_ALGORITHM);  
    		cipher.init(Cipher.DECRYPT_MODE, secretKey);
    		
    		return cipher.doFinal(crypt); 
    		
    	}
    	
    	/** 
    	 * 生成3DES密钥.  
    	 * 3DES 24 bytes key 
    	 */ 
    	private static SecretKey genDESKey(byte[] keyByte) {
    		SecretKey deskey = new SecretKeySpec(keyByte, CRYPT_ALGORITHM);
    		
    		return deskey;
        }
    	
    	/* Hash算法采用SHA-1 */
    	private static String createBase64Digest(String strEncryptValue)
    		throws NoSuchAlgorithmException {
    		String strSHA1Value = null;
    		
     		//*********************************************************************
    		byte[] bHashValue = null;
    		try {
    			MessageDigest mdSHA1 = MessageDigest.getInstance("SHA-1");
    			mdSHA1.update(strEncryptValue.getBytes());
    			
    			bHashValue = mdSHA1.digest();
    		} catch (NoSuchAlgorithmException e) {
    			throw e;
    		}
    		//*********************************************************************
    		
    		strSHA1Value = new String(Base64.encode(bHashValue));
    		return strSHA1Value;
    	}
    下面是他给我的BASE64相关代码
    public class Base64 {
    
    	public Base64() {
    	}
    
    	public static byte[] encode(byte data[]) {
    		ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    		try {
    			encoder.encode(data, 0, data.length, bOut);
    		} catch (IOException e) {
    			throw new RuntimeException("exception encoding base64 string: " + e);
    		}
    		return bOut.toByteArray();
    	}
    
    	public static int encode(byte data[], OutputStream out) throws IOException {
    		return encoder.encode(data, 0, data.length, out);
    	}
    
    	public static int encode(byte data[], int off, int length, OutputStream out)
    			throws IOException {
    		return encoder.encode(data, off, length, out);
    	}
    
    	public static byte[] decode(byte data[]) {
    		ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    		try {
    			encoder.decode(data, 0, data.length, bOut);
    		} catch (IOException e) {
    			throw new RuntimeException("exception decoding base64 string: " + e);
    		}
    		return bOut.toByteArray();
    	}
    
    	public static byte[] decode(String data) {
    		ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    		try {
    			encoder.decode(data, bOut);
    		} catch (IOException e) {
    			throw new RuntimeException("exception decoding base64 string: " + e);
    		}
    		return bOut.toByteArray();
    	}
    
    	public static int decode(String data, OutputStream out) throws IOException {
    		return encoder.decode(data, out);
    	}
    
    	private static final Encoder encoder = new Base64Encoder();
    }
    2009年7月6日 1:09
  • 厂商并没有提供全部的源码,只是这些了。
    2009年7月6日 1:11
  • 因为密钥是网通服务商给我的,难道说密钥不用服务商提供给我的也不耽误加密解密吗? 现在异常已经不是密钥产生的了,而是解密时DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)这个方法带出“不正确数据”的异常。不过还是感谢您的回答。
    你不是在解密通过Java程序加密的数据呢? 你检查下解密的数据的长度是8的倍数吗

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年7月6日 8:31
    版主
  • 没错啊,8位的,24位的,都是8的倍数。
    2009年7月7日 1:14
  • using System;
    
    using System.Text;
    
    using System.Security.Cryptography;
    
    using System.IO;
    
    
    
    namespace X.Library
    
    {
    
      /// <summary>
    
      /// 标题:字符串加密解密
    
      /// 作者:X.X.Y
    
      /// 日期:2009-05-02 00:09:00
    
      /// 描述:
    
      /// </summary>
    
      public class StringCrypto
    
      {
    
        private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    
        /// <summary>
    
        /// 使用指定的密钥加密字符串
    
        /// </summary>
    
        /// <param name="fKey">密钥</param>
    
        /// <param name="fValue">将要加密的字符串</param>
    
        /// <returns>加密后的字符串</returns>
    
        public static String Encrypt(String fKey, String fValue)
    
        {
    
          byte[] tKey = Encoding.UTF8.GetBytes(BuildKey( fKey));
    
          byte[] tIV = IV;
    
          byte[] tValue = Encoding.UTF8.GetBytes(fValue);
    
          try
    
          {
    
            using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())
    
            {
    
              MemoryStream fMemoryStream = new MemoryStream();
    
              using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, desc.CreateEncryptor(tKey, tIV), CryptoStreamMode.Write))
    
              {
    
                fCryptoStream.Write(tValue, 0, tValue.Length);
    
                fCryptoStream.FlushFinalBlock();
    
                return Convert.ToBase64String(fMemoryStream.ToArray());
    
              }
    
            }
    
          }
    
          catch
    
          {
    
            return string.Empty;
    
          }
    
        }
    
    
    
        /// <summary>
    
        /// 使用指定的密钥解密字符串
    
        /// </summary>
    
        /// <param name="fKey">密钥</param>
    
        /// <param name="fValue">将要解密的字符串</param>
    
        /// <returns>解密后的字符串</returns>
    
        public static String Decrypt(String fKey, String fValue)
    
        {
    
          try
    
          {
    
            byte[] tKey = Encoding.UTF8.GetBytes(BuildKey(fKey));
    
            byte[] tIV = IV;
    
            byte[] tValue = Convert.FromBase64String(fValue);
    
            using (DESCryptoServiceProvider fServiceProvider = new DESCryptoServiceProvider())
    
            {
    
              MemoryStream fMemoryStream = new MemoryStream();
    
              using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, fServiceProvider.CreateDecryptor(tKey, tIV), CryptoStreamMode.Write))
    
              {
    
                fCryptoStream.Write(tValue, 0, tValue.Length);
    
                fCryptoStream.FlushFinalBlock();
    
                return Encoding.UTF8.GetString(fMemoryStream.ToArray());
    
              }
    
            }
    
          }
    
          catch
    
          {
    
            return string.Empty;
    
          }
    
        }
    
    
    
        private static String BuildKey(String fKey)
    
        {
    
          if (String.IsNullOrEmpty(fKey)) 
    
            fKey = "Y09M05#X";
    
          else if (fKey.Length < 8) 
    
            fKey = fKey.PadRight(8, 'X');
    
          else if (fKey.Length > 8) 
    
            fKey = fKey.Substring(0, 8);
    
          return fKey;
    
        }
    
      }
    
    }
    
    
    
    

    知识改变命运,奋斗成就人生!

    问题在这一句:
    using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())

    这不是3Des加密算法,是Des加密算法,DES的加密算法,密匙长度是64,也就是只能使用8字节作为密钥。

    换成:
    using (TripleDESCryptoServiceProvider desc = new TripleDESCryptoServiceProvider())

    再使用desc.KeySize =128(16字节),192(24字节),KeySize的范围是128-192


    天行健,君子当自强不息!
    2010年12月8日 9:00
  • using System;
    
    
    
    using System.Text;
    
    
    
    using System.Security.Cryptography;
    
    
    
    using System.IO;
    
    
    
    
    
    
    
    namespace X.Library
    
    
    
    {
    
    
    
     /// <summary>
    
    
    
     /// 标题:字符串加密解密
    
    
    
     /// 作者:X.X.Y
    
    
    
     /// 日期:2009-05-02 00:09:00
    
    
    
     /// 描述:
    
    
    
     /// </summary>
    
    
    
     public class StringCrypto
    
    
    
     {
    
    
    
      private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    
    
    
      /// <summary>
    
    
    
      /// 使用指定的密钥加密字符串
    
    
    
      /// </summary>
    
    
    
      /// <param name="fKey">密钥</param>
    
    
    
      /// <param name="fValue">将要加密的字符串</param>
    
    
    
      /// <returns>加密后的字符串</returns>
    
    
    
      public static String Encrypt(String fKey, String fValue)
    
    
    
      {
    
    
    
       byte[] tKey = Encoding.UTF8.GetBytes(BuildKey( fKey));
    
    
    
       byte[] tIV = IV;
    
    
    
       byte[] tValue = Encoding.UTF8.GetBytes(fValue);
    
    
    
       try
    
    
    
       {
    
    
    
        using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())
    
    
    
        {
    
    
    
         MemoryStream fMemoryStream = new MemoryStream();
    
    
    
         using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, desc.CreateEncryptor(tKey, tIV), CryptoStreamMode.Write))
    
    
    
         {
    
    
    
          fCryptoStream.Write(tValue, 0, tValue.Length);
    
    
    
          fCryptoStream.FlushFinalBlock();
    
    
    
          return Convert.ToBase64String(fMemoryStream.ToArray());
    
    
    
         }
    
    
    
        }
    
    
    
       }
    
    
    
       catch
    
    
    
       {
    
    
    
        return string.Empty;
    
    
    
       }
    
    
    
      }
    
    
    
    
    
    
    
      /// <summary>
    
    
    
      /// 使用指定的密钥解密字符串
    
    
    
      /// </summary>
    
    
    
      /// <param name="fKey">密钥</param>
    
    
    
      /// <param name="fValue">将要解密的字符串</param>
    
    
    
      /// <returns>解密后的字符串</returns>
    
    
    
      public static String Decrypt(String fKey, String fValue)
    
    
    
      {
    
    
    
       try
    
    
    
       {
    
    
    
        byte[] tKey = Encoding.UTF8.GetBytes(BuildKey(fKey));
    
    
    
        byte[] tIV = IV;
    
    
    
        byte[] tValue = Convert.FromBase64String(fValue);
    
    
    
        using (DESCryptoServiceProvider fServiceProvider = new DESCryptoServiceProvider())
    
    
    
        {
    
    
    
         MemoryStream fMemoryStream = new MemoryStream();
    
    
    
         using (CryptoStream fCryptoStream = new CryptoStream(fMemoryStream, fServiceProvider.CreateDecryptor(tKey, tIV), CryptoStreamMode.Write))
    
    
    
         {
    
    
    
          fCryptoStream.Write(tValue, 0, tValue.Length);
    
    
    
          fCryptoStream.FlushFinalBlock();
    
    
    
          return Encoding.UTF8.GetString(fMemoryStream.ToArray());
    
    
    
         }
    
    
    
        }
    
    
    
       }
    
    
    
       catch
    
    
    
       {
    
    
    
        return string.Empty;
    
    
    
       }
    
    
    
      }
    
    
    
    
    
    
    
      private static String BuildKey(String fKey)
    
    
    
      {
    
    
    
       if (String.IsNullOrEmpty(fKey)) 
    
    
    
        fKey = "Y09M05#X";
    
    
    
       else if (fKey.Length < 8) 
    
    
    
        fKey = fKey.PadRight(8, 'X');
    
    
    
       else if (fKey.Length > 8) 
    
    
    
        fKey = fKey.Substring(0, 8);
    
    
    
       return fKey;
    
    
    
      }
    
    
    
     }
    
    
    
    }
    
    
    
    
    
    
    
    

    知识改变命运,奋斗成就人生!

    问题在这一句:
    using (DESCryptoServiceProvider desc = new DESCryptoServiceProvider())

    这不是3Des加密算法,是Des加密算法,DES的加密算法,密匙长度是64,也就是只能使用8字节作为密钥。

    换成:
    using (TripleDESCryptoServiceProvider desc = new TripleDESCryptoServiceProvider())

    再使用desc.KeySize =128(16字节),192(24字节),KeySize的范围是128-192


    天行健,君子当自强不息!

    哈哈哈   3des 和 triple des   总会被忽略  我以前也犯过这样的错误
    入了ipad,最近用ipad上论坛
    2011年3月11日 6:49
    版主