【问题标题】:System.Security.Cryptography.CryptographicException: Specified key is not a valid size for this algorithmSystem.Security.Cryptography.CryptographicException:指定的密钥不是此算法的有效大小
【发布时间】:2020-09-25 01:14:00
【问题描述】:

使用从 Key Vault 检索的 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 个字符。结果 bytearray 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】:

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

    keyvault 中的字符串已经是“十六进制字符串”

    所以摆脱这个。

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

    鲍勃是你的叔叔。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多