Sto provando a leggere un valore Base64-Encoded da una tabella Database gestita sul lato Linux. In quella tabella c'è una colonna chiamata first_name. Sul lato Linux posso decifrare questo facilmente utilizzando il seguente comando in PHP:Come decrittografare un valore MCRYPT_RIJNDAEL_256 crittografato in C#, crittografato da mcrypt in PHP?
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, "patient_fn_salt",
base64_decode("H6XmkH+VWvdD88THCliKJjLisGZIBk3CTNvyQMLnhpo="),
MCRYPT_MODE_ECB);
Comunque cerco il più possibile di duplicare questa logica sul lato C# e tutto quello che ottiene è senza senso.
mio codice C# è al di sotto, spero che tu abbia qualche suggerimento perché ho finito di idee :(
byte [] cipherText =
Convert.FromBase64String("H6XmkH+VWvdD88THCliKJjLisGZIBk3CTNvyQMLnhpo=");
byte [] key = Encoding.UTF8.GetBytes("patient_fn_salt");
Array.Resize(ref key, 32);
byte [] iv = new byte[32];
string fname = Utilities.Decrypt(cipherText, key, iv);
public static string Decrypt(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// TDeclare the streams used
// to decrypt to an in memory
// array of bytes.
MemoryStream msDecrypt = null;
CryptoStream csDecrypt = null;
StreamReader srDecrypt = null;
// Declare the AesManaged object
// used to decrypt the data.
RijndaelManaged rj = new RijndaelManaged();
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
try
{
// Create an AesManaged object
// with the specified key and IV.
rj.Mode = CipherMode.ECB;
rj.BlockSize = 256;
rj.KeySize = 256;
rj.Padding = PaddingMode.Zeros;
rj.Key = Key;
rj.GenerateIV();
//rj.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rj.CreateDecryptor(rj.Key, rj.IV);
// Create the streams used for decryption.
msDecrypt = new MemoryStream(cipherText);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
srDecrypt = new StreamReader(csDecrypt);
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
finally
{
// Clean things up.
// Close the streams.
if (srDecrypt != null)
srDecrypt.Close();
if (csDecrypt != null)
csDecrypt.Close();
if (msDecrypt != null)
msDecrypt.Close();
// Clear the AesManaged object.
if (rj != null)
rj.Clear();
}
return plaintext;
}
}
Forse questo può aiutare. http://stackoverflow.com/questions/202011/encrypt-decrypt-string-in-net –
Solo una nota: il parametro 'IV' non è utilizzato nel metodo ... e la modalità ECB non ha vettori di inizializzazione. (Ma non credo che questo si riferisca al tuo problema.) –