利用Rijndael算法加密后再进行解密的话就会报错 错误信息为:"base-64字符数组的无效长度" 大家谁能告诉我怎么解决哦?

解决方案 »

  1.   

    确定 Key 与 IV 都对得上不;确定解密的数据无误不?
      

  2.   

    把 Key, IV, 明文贴上来看看? 应该没有问题的, 我也经常使用 RijndaelManager 加密只有一位的数据
      

  3.   

    您好,昨晚突然断网了,您看看 谢谢咯static Rijndael()
        {
            mobjCryptoService = new RijndaelManaged();
            Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";
        }
        public static byte[] GetLegalKey()
        {
            string sTemp = Key;
            mobjCryptoService.GenerateKey();
            byte[] bytTemp = mobjCryptoService.Key;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
                sTemp = sTemp.Substring(0, KeyLength);
            else if (sTemp.Length < KeyLength)
                sTemp = sTemp.PadRight(KeyLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        public static byte[] GetLegalIV()
        {
            string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            mobjCryptoService.GenerateIV();
            byte[] bytTemp = mobjCryptoService.IV;
            int IVLength = bytTemp.Length;
            if (sTemp.Length > IVLength)
                sTemp = sTemp.Substring(0, IVLength);
            else if (sTemp.Length < IVLength)
                sTemp = sTemp.PadRight(IVLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
      

  4.   

    用你的代码试了试, 没有问题啊....
            private static string Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";
            private static RijndaelManaged mobjCryptoService = new RijndaelManaged();        public static byte[] GetLegalKey()
            {
                string sTemp = Key;
                mobjCryptoService.GenerateKey();
                byte[] bytTemp = mobjCryptoService.Key;
                int KeyLength = bytTemp.Length;
                if (sTemp.Length > KeyLength)
                    sTemp = sTemp.Substring(0, KeyLength);
                else if (sTemp.Length < KeyLength)
                    sTemp = sTemp.PadRight(KeyLength, ' ');
                return ASCIIEncoding.ASCII.GetBytes(sTemp);
            }
            /// <summary> 
            /// 获得初始向量IV 
            /// </summary> 
            /// <returns>初试向量IV </returns> 
            public static byte[] GetLegalIV()
            {
                string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
                mobjCryptoService.GenerateIV();
                byte[] bytTemp = mobjCryptoService.IV;
                int IVLength = bytTemp.Length;
                if (sTemp.Length > IVLength)
                    sTemp = sTemp.Substring(0, IVLength);
                else if (sTemp.Length < IVLength)
                    sTemp = sTemp.PadRight(IVLength, ' ');
                return ASCIIEncoding.ASCII.GetBytes(sTemp);
            }        static void Main(string[] args)
            {
                // 随机的测试数据
                byte[] testBuff = new byte[1];
                Random r = new Random();
                r.NextBytes(testBuff);            // 加密
                RijndaelManaged encryptor = new RijndaelManaged();
                ICryptoTransform encryptForm = encryptor.CreateEncryptor(GetLegalKey(), GetLegalIV());            MemoryStream msE = new MemoryStream();
                CryptoStream csE = new CryptoStream(msE, encryptForm, CryptoStreamMode.Write);            csE.Write(testBuff, 0, testBuff.Length);
                csE.FlushFinalBlock();            // 密文
                byte[] encryptedBuff = msE.ToArray();            // 解密
                RijndaelManaged decryptor = new RijndaelManaged();
                ICryptoTransform decryptFrom = decryptor.CreateDecryptor(GetLegalKey(), GetLegalIV());            Byte[] decryptedBuff = new Byte[encryptedBuff.Length];            MemoryStream msD = new MemoryStream();
                msD.Write(encryptedBuff, 0, encryptedBuff.Length);
                msD.Seek(0, SeekOrigin.Begin);
                CryptoStream ds = new CryptoStream(msD, decryptFrom, CryptoStreamMode.Read);            ds.Read(decryptedBuff, 0, decryptedBuff.Length);            Console.WriteLine(string.Format("testBuff: {0}; decryptedBuff: {1}",
                    BitConverter.ToString(testBuff), BitConverter.ToString(decryptedBuff)));            Console.Read();
            }
      

  5.   

    Rijndael算法也会出现这种问题吗?我现在用的就是这个,不过用des算法的时候出现的问题现在就不出现了!