我使用从密钥库中检索到的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。我通过在线转换器验证了从字符串到十六进制的转换进展顺利。
解决方案是先不将我的字符串转换为字节数组,然后进行十六进制字符串转换。
密钥库中的字符串已经是“ 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;
}
鲍勃是你叔叔。