System.Security.Cryptography.CryptographicException: 指定的密钥不是该算法的有效大小

System.Security.Cryptography.CryptographicException: Specified key is not a valid size for this algorithm

使用从 Key Vault 中检索到的 AES 密钥,我正在尝试解密 blob 文件。但我不断收到:

System.Security.Cryptography.CryptographicException: Specified key is not a valid size for this

我正在尝试对 python 解密情况进行逆向工程,这向我表明我从密钥库中检索的值是一个十六进制字符串,或者至少应该作为十六进制字符串存储在bytearray.

Python:

aes_key= bytes.fromhex(aes_key)

因此,因为我使用 var keyStringValue = _configuration.GetValue<string>("the-key-i-want"); 从我的配置中获取它,所以我首先转换为字节数组,以便能够将其转换为十六进制字符串。然后再放入字节数组中。

    //Where I convert my Keyvault keyStringValue to a hexString encoded bytearray
byte[] tempBytes = utf8.GetBytes(keyStringValue);
var hexString = BitConverter.ToString(tempBytes);
hexString = hexString.Replace("-", "").ToLower();

int NumberChars = hexString.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
    bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
byte[] pass = bytes;

我将传递变量传递给我的解密函数,如下所示:

 var crypto = new AesCryptographyService();

 var decryptedData = crypto.Decrypt(postSplitByteArray, pass, iv)

最后是我的解密:

public class AesCryptographyService

{      public byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
    {
        using var aes = Aes.Create();


        aes.Padding = PaddingMode.Zeros;
        aes.Mode = CipherMode.CBC;

        aes.Key = key;
        aes.IV = iv;

        using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
        {
            return PerformCryptography(data, decryptor);
        }
    }


 private byte[] PerformCryptography(byte[] data, ICryptoTransform cryptoTransform)
    {
        using (var ms = new MemoryStream())
        using (var cryptoStream = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Write))
        {
            cryptoStream.Write(data, 0, data.Length);
            cryptoStream.FlushFinalBlock();

            return ms.ToArray();
        }
    }

十六进制字符串的长度为 128 个字符。以及由此产生的 bytearray 64。现在我知道数组应该只有 32 个字节大。但是我看不出仅仅将我的关键削减到大小的意义。我也没有得到正确解密的结果。这让我很烦恼,因为 python 函数似乎和我一样。

 cipher = AES.new(aes256_key, AES.MODE_CBC, iv)
decrypted_data = cipher.decrypt(encrypted_data).decode('utf-8')

PS。我通过在线转换器验证了从字符串到十六进制字符串的转换进展顺利。

解决方案是不先将我的字符串转换为字节数组,然后再进行十六进制字符串转换。

keyvault 中的字符串已经是 "hexstring"

所以摆脱这个。

byte[] tempBytes = utf8.GetBytes(keyStringValue);
var hexString = BitConverter.ToString(tempBytes);
hexString = hexString.Replace("-", "").ToLower();

var keyStringValue = _configuration.GetValue<string>("the-key-i-want")

将其传递给 hexstring 转换

  private static byte[] FromHex(string keyStringValue)
        {
            int NumberChars = keyStringValue.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(keyStringValue.Substring(i, 2), 16);

            return bytes;
        }

鲍勃是你的叔叔。