各位高手,你们好,我现在要对一个decimal类型的数值进行加密和解密,加密代码如下:
        public static byte[] EncryptString(Decimal sInputString, int id)
        {
            byte[] data = Encoding.UTF8.GetBytes(sInputString.ToString());
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = GetKey(id); 
            DES.IV = GetKey(id);
            ICryptoTransform desencrypt = DES.CreateEncryptor();
            int itmp = data.Length;
            byte[] result = desencrypt.TransformFinalBlock(data, 0, itmp);
            return result;
       }
解密代码如下:
       public static Decimal DecryptString(byte[] dInput, int id)
       {
            Decimal dValue = 0.00m;
            try
            {
                byte[] data = dInput;
                DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                DES.Key = GetKey(id);
                DES.IV = GetKey(id);
                ICryptoTransform desencrypt = DES.CreateDecryptor();
                byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
                dValue = Decimal.Parse(Encoding.UTF8.GetString(result));
            }
            catch
            { }
            return dValue;
       }
但是我要求中间加密出来的要以Decimal类型的方式存入数据库,解密的时候是要用加密过的Decimal数值为参数进行解密。我用了BitConverter.GetBytes()进行转换。这时候数值不超过8位还好。如果超过8位。用这个方法就会有问题。不知道各位有什么办法帮我解决一下吗?在byte[]与decimal类型进行转换。长度最好有16位以上。谢谢各位,我的MSN是:[email protected]欢迎大家加我,指点我一下。先谢过了。

解决方案 »

  1.   

    DES加密的块长度为64位,也就是8个字节,所以你的那个加密解密的方法超过了8位会有问题,你可以自己把超过8位的数转换成byte数组后自己分组加密,也可以用一个CryptoStream来辅助进行加解密,这是MSDN中的推荐方法。下面的例子可以给你参考。
    加密
    public static byte[] Decrypt (byte[] bKey, byte[] bStr)
    {
      byte[] bIV = new byte[8] {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
      DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
      MemoryStream mStream = new MemoryStream();
      CryptoStream cStream = new CryptoStream(mStream,    desc.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write);
      cStream.Write(bStr, 0, bStr.Length);
      cStream.FlushFinalBlock();
      return mStream.ToArray();
    }解密
    public static byte[] Encrypt (byte[] bKey, byte[] bStr)
    {
      byte[] bIV = new byte[8] {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
      DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
      MemoryStream mStream = new MemoryStream();
      CryptoStream cStream = new CryptoStream(mStream, desc.CreateEncryptor(bKey,  bIV), CryptoStreamMode.Write);
      cStream.Write(bStr, 0, bStr.Length);
      cStream.FlushFinalBlock();
      return mStream.ToArray();
    }
      

  2.   

    确实是超过8位就会有问题。现在问题是,我只有一个字段来存储这个值,而且加密出来的一定要是数值类型的。在byte数组和decimal好像这样转换是真转换不了了。不知道还有没有其他的更好的解决办法?
      

  3.   

    如果原文的长度超过8位,DES加密肯定超过8位,这个你就不用想了。你说的一个字段来存储意思是一个字节??
      

  4.   

    DES加密一定要用到byte数组吗?我所说的一个字段,是指的数据库里。只有一个字段用来存这个值。
      

  5.   

    对,DES加密必须用byte数组。你存储加密结果的这个字段是什么数据类型?
      

  6.   

    真不明白你们为什么要将加密后的结果保存为decimal类型,晕啊。我知道的公开的加密算法,就没有能实现你现在的要求的。如果你们对加密的强度要求不是很高,你自己定义一个算法吧,比如什么异或、移位、反转反正你就自己折腾吧。这样对方拿不到源代码就不太好破译了。
    反正强烈建议修改保存的数据类型。
      

  7.   

    哈哈。谢谢limeng315兄了。我也说最好改数据类型,老大说不让改。没办法。只好来求救了。再次感谢各位。