各位好,
这几天遇到难题了,.NET的System.Security.Cryptography命名空间下有一个类DSACryptoServiceProvider,我现在需要用这个类进行加密操作,私钥我已经有了,可是每次赋值都报错,程序如下,可是每次执行到ImportParameters()时就会报错:不正确的数据。有知道的吗,望指点下。
DSACryptoServiceProvider DSA = new DSACryptoServiceProvider();
                DSAParameters para1 = DSA.ExportParameters(true);                string strP = "XX"; //10个字符 
                para1.X = Encoding.ASCII.GetBytes(strP);                strP = "XX"; //128个字符
                para1.P = Encoding.ASCII.GetBytes(strP);                strP = "XX"; //10个字符               
                para1.Q =   Encoding.ASCII.GetBytes(strP);                strP = "XX"; //128个字符
                para1.G = Encoding.ASCII.GetBytes(strP);                strP = "XX"; //128个字符
                para1.Y = Encoding.ASCII.GetBytes(strP);                DSA.ImportParameters(para1);

解决方案 »

  1.   

    我记得应该是直接操作那个Key和IV属性的,你怎么去修改DSAParameters了啊,它里面各个属性的关系你清楚吗?加载的时候,不满足关系的话,肯定是会报错的。
      

  2.   

    这个是用的DSA加密,我没找到Key和IV属性啊,是的,各个属性的关系不清楚。
    其实我就是想知道怎么给这个类的Key赋值,就是找不到Key属性在哪。
      

  3.   

    Encoding.ASCII.GetBytes这种用法估计是错的:key极少可能所有字节都是ASCII。
    试试用base64编码,或者16进制编码。
      

  4.   

    参考这个加密函数:        /// <summary>
            /// 使用对称加密技术 DES 加密字符串。
            /// </summary>
            /// <param name="s">要加密的字符串。</param>
            /// <param name="k">加密密钥(长度必须为 8 位)。</param>
            /// <returns>加密后的字符串</returns>
            public static string DESEncrypt(string s, string k)
            {
                DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
                byte[] bytes = Encoding.Default.GetBytes(s);
                provider.Key = Encoding.ASCII.GetBytes(k);
                provider.IV = Encoding.ASCII.GetBytes(k);
                MemoryStream stream = new MemoryStream();
                CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
                stream2.Write(bytes, 0, bytes.Length);
                stream2.FlushFinalBlock();
                StringBuilder builder = new StringBuilder();
                foreach (byte num in stream.ToArray())
                {
                    builder.AppendFormat("{0:X2}", num);
                }
                builder.ToString();
                stream2.Close();
                stream.Close();
                return builder.ToString();
            }
      

  5.   

    这个是对称加密的,跟DSA的非对称加密用法不一样。
      

  6.   

    你看一看下贴2楼的代码例子吧。
    http://topic.csdn.net/u/20120226/19/3f8f13b8-85cd-4948-bdbd-5aa83a49eb08.html
      

  7.   

    晕,看到D开头的,还以为是DES,差了2个字母,东西完全不同。你这里的私钥是什么格式的,如果是用ToXmlString导出的,那么只要用FromXmlString导入,就可以得到想要的DSA类了——关键是那个私钥的组成成分。
      

  8.   

    这个私钥只由p、q、g和x四个字符串组成,但是FromXmlString中还需要Seed和Counter两个参数,我不知道这两个参数该如何设置。我胡乱写了这两个参数,DSA.FromXmlString(str)就报错,依然是“不正确的数据”这个错误。