By running the following Apex code in Salesforce, I encrypt the string:
public static String getEncryptedData() { Blob cryptoKey = Crypto.generateAesKey(256); String dataToEncrypt = 'Test string'; Blob encryptedData = Crypto.encryptWithManagedIV('AES256', cryptoKey, Blob.valueOf(dataToEncrypt)); return EncodingUtil.base64Encode(encryptedData); }
Assuming this implementation is correct, I need to decrypt it in C #. I have the following, but I see that the error "Filling is invalid and cannot be deleted." (An example of a key and an encrypted string value, of course):
private string Decrypt(string encryptedbase64Password) { RijndaelManaged aes256 = new RijndaelManaged(); aes256.KeySize = 256; aes256.Mode = CipherMode.CBC; aes256.Padding = PaddingMode.PKCS7; aes256.BlockSize = 128; // Salesforce.com stores the first 16 bytes as the IV // Extract first 16 bytes as IV, the rest as the Key string keyAndIv = "Ii7oSjjWuhp6J6/hj/wmivqx1h3N2HzJ2ByJOy1n89E="; // sample from SFDC // hard coded for this example: encryptedbase64Password = "hRVlbM79aEQi8Tz7JJIL7CEhSxZAJvCh8Ni6ORP1C55+qbJzjDshBYBjyP12/zT2"; byte[] allBytes = Convert.FromBase64String(keyAndIv); byte[] iv = new byte[16]; Array.Copy(allBytes, 0, iv, 0, iv.Length); byte[] key = new byte[allBytes.Length - 16]; Array.Copy(allBytes, 16, key, 0, key.Length); aes256.Key = key; aes256.IV = iv; ICryptoTransform decrypto = aes256.CreateDecryptor(); byte[] encryptedbytes = Convert.FromBase64String(encryptedbase64Password); byte[] decryptedText = decrypto.TransformFinalBlock(encryptedbytes, 0, encryptedbytes.Length); string result = Convert.ToBase64String(decryptedText); return result; }
What am I doing wrong?
source share