2012-05-12 10 views
9

Ich versuche, eine Zeichenfolge mit C# zu verschlüsseln und entschlüsseln sie mit Python. Der Verschlüsselungs-/Entschlüsselungsteil funktioniert wie erwartet (d. H. Ich bin in der Lage, die ursprünglich verschlüsselte Zeichenfolge zu entschlüsseln). Die von Python zurückgegebene Zeichenfolge hat jedoch am Anfang zwei zusätzliche Bytes und jedes Zeichen ist durch ein Leerzeichen getrennt.Entschlüsseln in Python eine Zeichenfolge, die mit .NET verschlüsselt

**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" 

Warum bekomme ich diese zwei zusätzlichen Bytes am Anfang der Zeichenfolge? Warum all diese Leerzeichen in der entschlüsselten Zeichenkette? Irgendeine Idee warum?

Danke!

Verschlüsselung mit 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"); 

Entschlüsselungs mit 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

Wie kann ich mit Python für .NET RSA Algorithmus Verschlüsselung entschlüsseln? – Neo

Antwort

10

Die Zeichenfolge wird an Bytes codiert die UTF-16-Codierung. Die ersten zwei Bytes sind eine Stückliste. Dann wird jedes Zeichen in zwei Bytes codiert.

Aus der Dokumentation für Encoding.Unicode:

Ruft eine Codierung für das UTF-16-Format der Little-Endian-Byte-Reihenfolge.

Um die ursprüngliche Zeichenfolge zu erhalten, müssen Sie sie aus UTF-16 Bytes in eine Unicode-Zeichenfolge zurückdecodieren.

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

Wow! Danke, Mark! Jetzt, wo ich die Zeichenkette mit utf-16 dekodiere (wie Sie vorgeschlagen haben), lautet die resultierende Zeichenkette: "Etwas, das Sie mit AESࠈࠈࠈࠈ privat halten wollen". Irgendeine Idee, wie man die letzten 4 Charaktere loswird? – Martin

+1

Versuchen Sie, Padding für SymmetricAlgorithm auf Nullen zu setzen http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.padding. Standardmäßig verwendet es PKCS7 –

+1

ich suchte nach einer Methode der Verschlüsselung in. NET/C# und Entschlüsselung in Python und stieß auf diesen Beitrag .. Ich auch bekomme die Auffüllung. Meine zeigt sich als "test2" mit den zusätzlichen E-Zeichen. Ich habe versucht, PaddingMode auf der Seite. NET von PKCS7 auf None zu ändern und es machte keinen Unterschied? –

Verwandte Themen