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

问题描述 投票:0回答:1

我使用从密钥库中检索到的AES密钥,试图解密Blob文件。但我不断得到:

System.Security.Cryptography.CryptographicException:指定的密钥为 无效的尺寸

我正在尝试对python解密情况进行逆向工程,这向我暗示我从密钥库中检索的值是十六进制字符串,或者至少应作为十六进制字符串存储在字节数组中。

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;

我将pass变量传递给我的解密函数,看起来像这样:

 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个字符。结果是64个字节数组。现在我知道该数组应该只有32个字节大。但是我看不到仅仅削减密钥的意义。我也没有得到正确解密的结果。这使我很烦,因为python函数似乎和我做的一样。

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

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

encryption aes
1个回答
0
投票

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

密钥库中的字符串已经是“ hexstring”

所以摆脱这个。

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

和来自

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

将其传递给十六进制转换

  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;
        }

鲍勃是你叔叔。

© www.soinside.com 2019 - 2024. All rights reserved.