提供的KEY是86A659D3035B51B1B66DF3139F1AEC33F6651334F1E61280,IV是0807060504030201 
但是到程序调到 
ct = mCSP.CreateEncryptor(keys, ivs);这部的时候就出现“指定键的大小对于此算法无效”错误,是什么原因? 
上面的KEY,IV,我都转化成byte,有什么问题吗,请大虾指出,学习中...

解决方案 »

  1.   

    24位是上面的KEY只有24个字符还是什么??我认为上面是16进制,就把上面的KEY转化成了字节数组,是有24个
      

  2.   

    很显然,Key 表达了一个长度为24的byte[],key[0] = 0x86,key[1] = 0xa6,以此类推,这样转换的key才是正确的。
      

  3.   

    看看你的Key转换为你的keys后,keys是多少位,确定一下
      

  4.   

    如果你的Key的长度为8,应该可以,如果你想加长key,估计要使用Rijndael。
    我在上面说Key的长度必须为16或24位是错误的,抱歉。string strText = "admin";
    byte[] fKey = Encoding.ASCII.GetBytes("12345678");
                byte[] fIV = Encoding.ASCII.GetBytes("0807060504030201");
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(fKey, fIV), CryptoStreamMode.Write);
                StreamWriter sw = new StreamWriter(cs);
                sw.Write(strText);
                sw.Flush();
                cs.FlushFinalBlock();
                ms.Flush();
                string result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length)); 
      

  5.   

    你在执行mCSP.CreateEncryptor(keys, ivs)的时候,可以查看mCSP的Key和IV各是多长,然后用对应长度的byte[]写进去就好了。如果你想提供更长的Key,那么可以使用Rijndael来生成加密器:Rijndael alg = Rijndael.Create();
    alg.Key = Key;//32
    alg.IV = IV;//16CryptoStream cs = new CryptoStream(ms,alg.CreateEncryptor(), CryptoStreamMode.Write);
    //下面代码都一样了,主要是生成加密器
      

  6.   

    提供的KEY是86A659D3035B51B1B66DF3139F1AEC33F6651334F1E61280,IV是0807060504030201 
    根据上面提供的参数,一定要生成KEYS数组的长度是32,IV数组的长度是16吗??那提示这个错误主要是什么原因??
      

  7.   

    把上面的KEY生成32位是怎样转化的呢??
      

  8.   

    如果KEY是16位或24位,那对应的IV要几位呢??
      

  9.   


    你想把48位的16进制串,转换成32位的byte[]?这是不可能的事情。
    DES的KEY,和IV都是8个字节长,也就是64位,如果你使用的是DES,那么你的Key和IV都用8个字节就OK了,就像我上面的例子。如果你想加强密钥,可以考虑用AES,高级加密标准,就是我在上面提到的Rijndael,可以使用更长的KEY。单就你的问题,我觉得你为什么要局限于你所输入的48位16进制串呢?
    如果你的要求就是KEY的长度是24个字节(48位16进制串),那么你的加密就需要用高级加密标准,也就是要使用Rijndael。示例如下:
    Rijndael alg = Rijndael.Create();
     string raw = "86A659D3035B51B1B66DF3139F1AEC33F6651334F1E61280";
    byte[] b3 = hexStringToBytes(raw);
    alg.Key = b3;MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
    StreamWriter sw = new StreamWriter(cs);
    sw.Write(strText);
    sw.Flush();
    cs.FlushFinalBlock();
    ms.Flush();
    string result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length)); hexStringToBytes:private byte[] hexStringToBytes(string hexString)
            {
                byte[] bytes = new byte[hexString.Length / 2 + (hexString.Length % 2 == 0 ? 0 : 1)];
                for(int i = 0 ; i < bytes.Length ; i ++)
                {
                    if(hexString.Length <= i*2 + 1)
                    {
                        bytes[i] = Convert.ToByte(Convert.ToInt32(hexString[i*2].ToString(), 16));
                    }
                    else
                    {
                        bytes[i] = Convert.ToByte(Convert.ToInt32(hexString.Substring(i*2, 2), 16));
                    }
                }            return bytes;
            }
      

  10.   

    如果把IV也设置成你给的,就这样:Rijndael alg = Rijndael.Create();
    alg.Key = hexStringToBytes("86A659D3035B51B1B66DF3139F1AEC33F6651334F1E61280");
    alg.IV = hexStringToBytes("0807060504030201");MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
    StreamWriter sw = new StreamWriter(cs);
    sw.Write(strText);
    sw.Flush();
    cs.FlushFinalBlock();
    ms.Flush();
    string result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length));