2012-05-12 23 views
9

Estoy tratando de encriptar una cadena usando C# y descifrarla usando Python. La parte de cifrado/descifrado funciona como se espera (es decir, puedo descifrar la cadena que cifré originalmente). Sin embargo, la cadena devuelta por Python tiene 2 bytes adicionales al principio y cada carácter está separado por un espacio.Descifrar en Python una cadena encriptada usando .NET

**Original string** (before encryption -- encrypted using C#) = "Something you want to keep private with AES" 

**Decrypted string** (using Python) = "��S o m e t h i n g y o u w a n t t o k e e p p r i v a t e w i t h A E S" 

¿Por qué obtengo estos dos bytes adicionales al principio de la cadena? ¿Por qué todos esos espacios en la cadena descifrada? ¿Alguna idea de por qué?

Gracias!

Cifrado con C#

public static string Encrypt<T>(string value, string password, string salt) 
     where T : SymmetricAlgorithm, new() 
{ 
    DeriveBytes rgb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(salt)); 

    SymmetricAlgorithm algorithm = new T(); 

    byte[] rgbKey = rgb.GetBytes(algorithm.KeySize >> 3); 
    byte[] rgbIV = rgb.GetBytes(algorithm.BlockSize >> 3); 

    ICryptoTransform transform = algorithm.CreateEncryptor(rgbKey, rgbIV); 

    using (MemoryStream buffer = new MemoryStream()) 
    { 
     using (CryptoStream stream = new CryptoStream(buffer, transform, CryptoStreamMode.Write)) 
     { 
      using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode)) 
      { 
       writer.Write(value); 
      } 
     } 

     return Convert.ToBase64String(buffer.ToArray()); 
    } 
} 


string plain = "Something you want to keep private with AES"; 
string encrypted = CipherUtility.Encrypt<AesManaged>(plain, "password", "salt"); 

descifrado con Python + pycrypto

import base64, sys 
import Crypto.Cipher.AES 

password = base64.b64decode('PSCIQGfoZidjEuWtJAdn1JGYzKDonk9YblI0uv96O8s=') # See rgbKey 
salt = base64.b64decode('ehjtnMiGhNhoxRuUzfBOXw==') # See rgbIV 
aes = Crypto.Cipher.AES.new(password, Crypto.Cipher.AES.MODE_CBC, salt) 
text = base64.b64decode('QpHn/fnraLswwI2Znt1xTaBzRtDqO4V5QI78jLOlVsbvaIs0yXMUlqJhQtK+su2hYn28G2vNyLkj0zLOs+RIjElCSqJv1aK/Yu8uY07oAeStqRt4u/DVUzoWlxdrlF0u') 

print aes.decrypt(text) 
+0

¿Cómo puedo descifrar el uso de Python para el cifrado del algoritmo .NET RSA? – Neo

Respuesta

10

La cadena se codifica a bytes utilizando la codificación UTF-16. Los primeros dos bytes son una lista de materiales. Entonces, cada personaje está codificado en dos bytes.

De la documentación de Encoding.Unicode:

obtiene una codificación para el formato UTF-16 usando el byte menos significativo.

Para obtener la cadena original, necesita decodificarla desde bytes UTF-16 a una cadena Unicode.

print aes.decrypt(text).decode('utf-16') 
+1

¡Guau! ¡Gracias, Mark! Ahora que estoy decodificando la cadena usando utf-16 (como usted propuso), la cadena resultante es: "Algo que desea mantener en privado con AESࠈࠈࠈࠈ". ¿Alguna idea de cómo deshacerse de los últimos 4 personajes? – Martin

+1

Intenta configurar el relleno de SymmetricAlgorithm a ceros http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.padding. Por defecto usa PKCS7 –

+1

estaba buscando un método de encriptación en .net/C# y descifrado en python y encontré esta publicación .. yo también estoy obteniendo el relleno. El mío aparece como "test2ЄЄ" con el extra E buscando caracteres. intenté cambiar PaddingMode a None en el lado .net de PKCS7 y no importó ?? –

Cuestiones relacionadas