2010-02-11 33 views
6

tôi giải mã dữ liệu sử dụng PHP với mã này:Không thể giải mã dữ liệu với C# đã được mã hóa sử dụng PHP (Rijdael-128)

$content="1234"; 
$cp = mcrypt_module_open('rijndael-128', '', 'cbc', ''); 
$iv = mcrypt_create_iv(16, MCRYPT_RAND); 
$key = pack("H*",md5('a')); 
mcrypt_generic_init($cp, $key, $iv); 
$encrypted = mcrypt_generic($cp, $content); 
echo base64_encode($key)."\n"; 
echo base64_encode($iv)."\n"; 
echo base64_encode($encrypted)."\n"; 
mcrypt_generic_deinit($cp); 
mcrypt_module_close($cp); 

$ iv và $ mã hóa sau đó được lưu vào tập tin và đọc trong mẫu C# ứng dụng:

var iv=...; 
var encrypted=...; 
var md5 = new MD5CryptoServiceProvider(); 
var key = md5.ComputeHash(Encoding.Default.GetBytes("a")); 
md5.Clear(); 

Console.WriteLine(Convert.ToBase64String(key)); 
Console.WriteLine(Convert.ToBase64String(iv)); 
Console.WriteLine(Convert.ToBase64String(encrypted)); 

sản lượng ở đây là chính xác giống như đầu ra từ PHP, vì vậy tôi có thể đảm bảo không có lỗi mã hóa Inbetween.

var rd = new RijndaelManaged { 
    Key = key, 
    IV = iv, 
    Mode = CipherMode.CBC, 
    KeySize = 128, 
    Padding = PaddingMode.Zeros 
}; 

var buffer = new byte[encrypted.Length]; 
using(var ms = new MemoryStream(buffer)) { 
    using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Write)) { 
    cs.Write(encrypted, 0, encrypted.Length); 
    ms.Read(buffer, 0, buffer.Length); 
    Console.WriteLine(Encoding.Default.GetString(buffer)); 
    } 
} 
rd.Clear(); 

Kết quả của giải mã khác nhau trên tất cả các chương trình bắt đầu, ngay cả với chính xác các dữ liệu đầu vào như nhau:

Đầu tiên chạy:
DMF1ucDxtqgxw5niaXcmYQ == < -Key
GoCeRkrL/EMKNH/BYeLsqQ == < IV
UBE3DkgbJgj1K/TISugLxA == < -Encrypted
OlOB99yiCYRDoLx + 0xxZxQ == < - "giải mã"

chạy thứ hai:
DMF1ucDxtqgxw5niaXcmYQ == < -Key
GoCeRkrL/EMKNH/BYeLsqQ == < IV
UBE3DkgbJgj1K/TISugLxA == < -Encrypted
w5fcY5Fbb9KRgoHfhqAztA == < - "giải mã"

chính , IV, Dữ liệu được mã hóa giống hệt nhau, nhưng ngày giải mã khác nhau và luôn luôn sai. bộ đệm phải chứa "1234" hoặc "1234" cộng với 12 dấu 0.

Tôi không thấy lý do tại sao các kết quả khác nhau và những gì không được làm việc, nhưng tôi đã được nhìn chằm chằm vào này mảnh darn mã trong vài giờ bây giờ, và có lẽ bỏ lỡ sai sót rõ ràng ...

Đảo ngược sự CryptoStream như thế này tạo ra kết quả sai giống hệt:

using(var ms = new MemoryStream(encrypted)) { 
    using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read)) { 
    cs.Read(buffer, 0, buffer.Length); 
    Console.WriteLine(Convert.ToBase64String(buffer)); 
    } 
} 

Trợ giúp? Cảm ơn! Alexander

Trả lời

5

Vâng, sửa đổi một mẫu cũ tội lỗi của tôi trong quá khứ tôi đã kết thúc với điều này:

static string Decrypt() {    
    byte[] keyBytes = Convert.FromBase64String("DMF1ucDxtqgxw5niaXcmYQ=="); 
    byte[] iv = Convert.FromBase64String("GoCeRkrL/EMKNH/BYeLsqQ=="); 
    byte[] cipherTextBytes = Convert.FromBase64String("UBE3DkgbJgj1K/TISugLxA=="); 

    var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros}; 

    using (var decryptor = symmetricKey.CreateDecryptor()) 
    using (var ms = new MemoryStream(cipherTextBytes)) 
    using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { 
    var plainTextBytes = new byte[cipherTextBytes.Length]; 
    int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length); 
    return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
    } 
} 

đó đã cho "1234" với dấu \ 0 ký tự .. Bạn chỉ cần quên để chuyển đổi byte [] vào chuỗi một lần nữa? Tôi còn thiếu sự khác biệt nào?

+0

Giải pháp rất đơn giản, nhưng phần lớn gây phiền nhiễu ... Bạn phải đặt thuộc tính "KeySize" * trước * thiết lập thuộc tính "Khóa". Tôi đã chuyển đổi từng bước mã của tôi để khớp với mã của bạn và ngay khi tôi chuyển hai bộ định tuyến, nó hoạt động. Trong trường hợp ai đó từ Microsoft đang lắng nghe, bạn có thể bao gồm một chút thông tin đó vào MSDN. Tôi biết điều đó là hiển nhiên khi bạn biết điều đó, nhưng ... Benjamin, Danke! –

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