没有填充给出要加密的数据长度无效的异常

本文关键字:数据 无效 异常 加密 填充 | 更新日期: 2023-09-27 18:15:49

我得到一个异常,"要加密的数据长度无效。"我理解这是因为我的输入数据的长度不是块大小的倍数。我对加密还是个新手,所以我有几个问题。

默认块大小是128,对吗?这不支持256块大小,所以如果我们发送这个的供应商要求,我如何发送256块大小?

如何在不调整填充的情况下使数据具有正确的长度,因为供应商也要求没有填充?

        string currentTime = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
        string userId = "";
        string baseURL = ConfigurationManager.AppSettings["baseURL"];
        string config = ConfigurationManager.AppSettings["keyType"];
        string key = "";
        //sets the base URL to use, parameters will still need to be configured.
        if (config == "Q")
            key = "KEY";
        else if (config == "P")
            key = "KEY";
        if(Request.Headers.AllKeys.Contains("memberof"))
        {
            if(Request.Headers["memberof"].Contains("GROUP-NAME"))
            {
                if (Request.Headers.AllKeys.Contains("user"))
                    userId = "tvs2"; //will come from header always 4 characters
                else
                    return;
                string[] keyArray = key.Split(',');
                sbyte[] sBytes = new sbyte[keyArray.Length];
                for (int i = 0; i < keyArray.Length; i++)
                {
                    sBytes[i] = Convert.ToSByte(keyArray[i]);
                }
                byte[] bytes = (byte[])(Array)sBytes;
                AesManaged tdes = new AesManaged();
                tdes.Key = bytes;
                tdes.Mode = CipherMode.CBC;
                tdes.Padding = PaddingMode.None;
                ICryptoTransform crpyt = tdes.CreateEncryptor();
                byte[] userData = Encoding.UTF8.GetBytes(userId);
                byte[] dateData = Encoding.UTF8.GetBytes(currentTime);
                byte[] userCipher = crpyt.TransformFinalBlock(userData, 0, userData.Length);
                byte[] dateCipher = crpyt.TransformFinalBlock(dateData, 0, dateData.Length);
                string encryptedUser = Convert.ToBase64String(userCipher);
                string encrpytedDate = Convert.ToBase64String(dateCipher);
                string url = baseURL
                    + "username="
                    + encryptedUser + "&timestamp="
                    + encrpytedDate;
                Response.Redirect(url);
            }
        }

没有填充给出要加密的数据长度无效的异常

使用流密码模式而不是块密码模式。也就是说,尝试使用AES-CTR代替AES-CBC。

如果您可以使用CipherMode.CTS(密文窃取)而不是CBC,您应该能够加密任意长度的数据(不一定是块大小的倍数),产生与输入长度相同的输出。