2012-05-12 57 views
9

Tôi đang cố mã hóa một chuỗi bằng C# và giải mã nó bằng Python. Phần mã hóa/giải mã hoạt động như mong đợi (tức là tôi có thể giải mã chuỗi ban đầu được mã hóa). Tuy nhiên, chuỗi trả về bởi Python có 2 byte phụ ở đầu và mỗi ký tự được phân tách bằng dấu cách.Giải mã bằng Python một chuỗi được mã hóa bằng cách sử dụng .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" 

Tại sao tôi nhận được thêm hai byte này ở đầu chuỗi? Tại sao tất cả các khoảng trống đó trong chuỗi được giải mã? Bất kỳ ý tưởng tại sao?

Cảm ơn!

Encryption với 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"); 

Decryption với 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

Tôi có thể giải mã bằng cách sử dụng Python để mã hóa thuật toán .NET RSA như thế nào? – Neo

Trả lời

10

Chuỗi được mã hóa để byte bằng cách sử dụng mã hóa UTF-16. Hai byte đầu tiên là một BOM. Sau đó, mỗi ký tự được mã hóa thành hai byte.

Từ tài liệu cho Encoding.Unicode:

Gets một mã hóa cho định dạng UTF-16 sử dụng ít để endian byte.

Để nhận chuỗi gốc bạn cần giải mã từ chuỗi UTF-16 thành chuỗi Unicode.

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

Wow! Cảm ơn Mark! Bây giờ tôi đang giải mã chuỗi bằng cách sử dụng utf-16 (như bạn đã đề xuất), chuỗi kết quả là: "Một cái gì đó bạn muốn giữ riêng tư với AESࠈࠈࠈࠈ". Bất kỳ ý tưởng làm thế nào để thoát khỏi 4 ký tự cuối cùng? – Martin

+1

Cố gắng đặt padding cho SymmetricAlgorithm thành số không http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.padding. Theo mặc định nó sử dụng PKCS7 –

+1

tôi đã tìm kiếm một phương pháp mã hóa trong .net/C# và giải mã trong python và đi qua bài đăng này .. tôi cũng đang nhận được padding. Của tôi cho thấy là "test2ЄЄ" với các ký tự E tìm kiếm thêm. tôi đã cố gắng thay đổi PaddingMode để Không có ở bên .net từ PKCS7 và nó không có sự khác biệt ?? –

Các vấn đề liên quan