I'm trying to convert few lines Python code into C# code. I'm facing an error where I don't know which line cuases that error. I have no idea about Python at all. I think I have made mistake of slicing sub array or decryption process then I rewrite with different ways such as Buffer.BlockCopy but no luck.
#Example grabbing JPEG instead of MP4
mediaurl = "url"
mediakey="UdoT3mfVvt3kMp0+MAybMlgVrnEyVAdxSamXQ+qbRog="
salt = "WhatsApp Image Keys"
mediaKeyExpanded = HKDF(base64.b64decode(mediakey),112,salt)
iv = mediaKeyExpanded[:16]
cipherKey = mediaKeyExpanded[16:48]
macKey = mediaKeyExpanded[48:80]
mediaData = urllib2.urlopen(mediaurl).read()
file = mediaData[:-10]
mac = mediaData[-10:]
decryptor = AES.new(cipherKey, AES.MODE_CBC, iv)
imgdata=AESUnpad(decryptor.decrypt(file))
with open('rob.jpg', 'wb') as f:
f.write(imgdata)
print("file written to rob.jpg")
C# code Hkdf
var hkdf = new Hkdf(System.Security.Cryptography.HashAlgorithmName.SHA256);
var mediakey = Convert.FromBase64String("UdoT3mfVvt3kMp0+MAybMlgVrnEyVAdxSamXQ+qbRog=");
var salt = Encoding.UTF8.GetBytes("WhatsApp Image Keys");
var mediaKeyExpanded = hkdf.Expand(mediakey, 112, salt); //HKDF(base64.b64decode(mediakey), 112, salt)
var length = mediaKeyExpanded.Length;
var iv = mediaKeyExpanded.Skip(0).Take(16).ToArray(); //mediaKeyExpanded[:16]
var cipherKey = mediaKeyExpanded.Skip(16).Take(32).ToArray(); //mediaKeyExpanded[16:48]
var macKey = mediaKeyExpanded.Skip(48).Take(32).ToArray(); //mediaKeyExpanded[48:80]
var mediaData = File.ReadAllBytes("file.enc");
length = mediaData.Length;
var fileLength = length - 10;
var file = mediaData.Take(fileLength).ToArray(); //mediaData[:-10]
var mac = mediaData.Skip(fileLength).Take(10).ToArray();//mediaData[-10:]
//decryptor = AES.new(cipherKey, AES.MODE_CBC, iv)
//imgdata = AESUnpad(decryptor.decrypt(file))
using (var rijndaelManaged = new RijndaelManaged {
Key = cipherKey, IV = iv, Mode = CipherMode.CBC, KeySize = 256, BlockSize = 128
})
{
rijndaelManaged.Padding = PaddingMode.Zeros;
using (var memoryStream = new MemoryStream(file))
using (var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(cipherKey, iv), CryptoStreamMode.Read))
using (var fsOut = new FileStream(@"C:\Users\Name\Desktop\file_decrypted.jpg", FileMode.Create))
{
int data;
while ((data = cryptoStream.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
}
}
This is the file I'm trying to decrypt.
Edit: The image file is successfully created but cannot be open by any image viewer due to bad or unsupported format.