0

我目前有以下代码。

我正在byte array从硬编码的随机生成一个string

现在我注意到在设置Rijndael类时,应用程序在设置键值时崩溃。关于设置键值时为什么会崩溃的任何建议。

int olength = 18; 
string HKey = "ABCDEFGHIJKL111100002222"; //Some random string 
byte[] key = Convert.FromBase64String(HardcodedKey); //key.length = 18
byte[] iv = Encryption.GenerateRandomBytes(olength);
CryptoStream cs = Encryption.AES128Stream(key, iv, Context.Response.Body);

现在上面的方法被调用如下

public static CryptoStream AES128Stream(byte[] key, byte[] iv, Stream stream)
{
    try
    {
        Rijndael rijndael = Rijndael.Create();
        rijndael.Mode = CipherMode.CBC;
        rijndael.Padding = PaddingMode.PKCS7;
        rijndael.KeySize = 128;
        rijndael.BlockSize = 128;
        rijndael.Key = key;  ///---->CRASHES HERE
        rijndael.IV = iv;

        ICryptoTransform rijndaelEncryptor = rijndael.CreateEncryptor();
        return new CryptoStream(stream, rijndaelEncryptor, CryptoStreamMode.Write);
    }
    catch (Exception e)
    {
        throw e;
    }
}

在附加信息中指出

附加信息:指定的密钥不是此算法的有效大小。

在那种情况下,我可以使用什么字符串才能工作?为什么这个字符串不起作用?

4

1 回答 1

3

由于您将 Rjindael 定义为具有 128 位的密钥大小,因此您必须为该类提供正好 16 个字节才能工作。您的密钥似乎太长(或太短)。

另外,由于我不知道您的真实密钥,我不知道您Convert.FromBase64String()是否正确使用。但是,我建议您可以直接使用byte[]来避免该问题:

//put 16 to be really sure.
byte[] key = new byte[16] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
于 2016-02-20T00:59:43.613 回答