2010-02-11 8 views
6

मैं इस कोड के साथ PHP का उपयोग डेटा को डिक्रिप्ट:साथ सी # है कि 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 और $ एन्क्रिप्टेड तो फाइल और सी # नमूने में पढ़ने के लिए सहेजा जाता है एप्लिकेशन:

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)); 

यहां उत्पादन बिल्कुल PHP से उत्पादन के रूप में ही है, इसलिए मैं आश्वस्त कर सकते हैं वहाँ 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(); 

डिक्रिप्शन का परिणाम है, हर कार्यक्रम प्रारंभ पर भिन्न होता है यहां तक ​​कि बिल्कुल एक ही इनपुट डेटा के साथ:

फर्स्ट रन:
DMF1ucDxtqgxw5niaXcmYQ == < -कुंजी
GoCeRkrL/EMKNH/BYeLsqQ == < -IV
UBE3DkgbJgj1K/TISugLxA == < -एन्क्रिप्टेड
OlOB99yiCYRDoLx + 0xxZxQ == < - "decrypted"

+०१२३५१६४१०

दूसरा रन:
DMF1ucDxtqgxw5niaXcmYQ == < -कुंजी
GoCeRkrL/EMKNH/BYeLsqQ == < -IV
UBE3DkgbJgj1K/TISugLxA == < -एन्क्रिप्टेड
w5fcY5Fbb9KRgoHfhqAztA == < - "decrypted"

कुंजी , IV, एन्क्रिप्टेड डेटा समान हैं, लेकिन फिर भी डिक्रिप्ट की गई तारीख भिन्न होती है और हमेशा गलत होती है। बफर में "1234" या "1234" प्लस 12 पीछे वाले शून्य होना चाहिए।

मैं नहीं दिख रहा है यही कारण है कि परिणाम अलग-अलग है और क्या काम नहीं कर रहा है, लेकिन मैं कई घंटे के लिए कोड के इस रफ़ू टुकड़ा पर अब घूर कर दिया गया है, और शायद स्पष्ट त्रुटि याद आती है ...

पीछे इस तरह क्रिप्टोस्ट्रीम समान रूप से गलत परिणाम बनाता है:

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)); 
    } 
} 

सहायता? धन्यवाद! अलेक्जेंडर

उत्तर

5

ठीक है, अतीत के अपने पापों के एक पुराने नमूना मैं इस के साथ समाप्त हो गया संशोधित:

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); 
    } 
} 

जो "1234" \ 0 वर्ण पूर्ण विराम वाले दे दी है .. तुम सिर्फ कन्वर्ट करने के लिए भूल गए बाइट [] एक स्ट्रिंग फिर से? मुझे क्या अंतर है?

+0

समाधान बहुत आसान है, फिर भी अधिकतर परेशान है ... आपको "कुंजी" संपत्ति सेट करने से पहले "कुंजी आकार" संपत्ति * सेट करना होगा। मैंने आपके कोड से मिलान करने के लिए चरणबद्ध रूप से अपना कोड चरण परिवर्तित कर दिया, और जैसे ही मैंने दो सेटर्स को स्विच किया, यह काम किया। यदि माइक्रोसॉफ्ट के किसी व्यक्ति को सुन रहा है, तो आप उस जानकारी को एमएसडीएन में शामिल कर सकते हैं। मुझे पता है कि एक बार जब आप इसे जानते हैं तो यह स्पष्ट है, लेकिन ... बेंजामिन, डांके! –