0

「暗号化するデータの長さが無効です」という例外が発生します。これは、入力データの長さがブロック サイズの倍数ではないためだと理解しています。私はまだこの暗号化に慣れていないので、いくつか質問があります。

デフォルトのブロックサイズは 128 ですよね? これは 256 ブロック サイズをサポートしていません。送信先のベンダーが 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);
            }
        }
4

2 に答える 2

1

ブロック暗号モードではなく、ストリーム暗号モードを使用します。つまり、AES-CBC の代わりに AES-CTR を試してください。

于 2013-05-29T14:32:55.627 に答える
0

CipherMode.CTSCBC の代わりに (CipherText Stealing)を使用できる場合、任意の長さのデータ (ブロック サイズの倍数である必要はありません) を暗号化し、入力と同じ長さの出力を生成できるはずです。

于 2013-05-29T18:54:14.967 に答える