2012-06-12 32 views
7

मैं निम्नलिखित सी # कोड है कि कुंजी उत्पन्न करता है:अंतर

public static byte[] Encrypt(byte[] plainData, string salt) 
    { 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(salt); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(salt); 
     ICryptoTransform desencrypt = DES.CreateEncryptor(); 
     byte[] encryptedData = desencrypt.TransformFinalBlock(plainData, 0, plainData.Length); 
     return encryptedData; 
    } 

    private string GetEncryptedKey(string key) 
    { 
     return BitConverter.ToString(KeyGeneratorForm.Encrypt(ASCIIEncoding.ASCII.GetBytes(key), "abcdefgh")).Replace("-", ""); 
    } 

मैं PHP में एक ही बात को करने के लिए कोशिश कर रहा हूँ:

function get_encrypted_key($key){ 
    $salt = "abcdefgh"; 
    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

हालांकि, वहाँ है परिणामों में एक छोटे से discrepency, पिछले 16 वर्ण के रूप में हमेशा अलग हैं:

With key "Benjamin Franklin": 
C# : 0B3C6E5DF5D747FB3C50DE952FECE3999768F35B890BC391 
PHP: 0B3C6E5DF5D747FB3C50DE952FECE3993A881F9AF348C64D 

With key "President Franklin D Roosevelt": 
C# : C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB32A86FABCEA5711E1 
PHP: C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB37ACBE60BB1D21F3F 

मैं भी गद्दी टी प्रदर्शन करने की कोशिश की है निम्नलिखित कोड का उपयोग करके मेरी कुंजी के लिए ransform:

function get_encrypted_key($key){ 
    $salt = "abcdefgh"; 

    $extra = 8 - (strlen($key) % 8); 
    if($extra > 0) { 
     for($i = 0; $i < $extra; $i++) { 
      $key.= "\0"; 
     } 
    } 

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

लेकिन मैं बिना पैडिंग के परिणाम के साथ समाप्त होता हूं।

यदि आपके पास क्या हो रहा है, इस बारे में कोई संकेत है, तो मुझे इसके बारे में सुनकर खुशी होगी! :)

धन्यवाद

+3

हो सकता है कि विभिन्न गद्दी योजनाओं का एक परिणाम? – mensi

+2

यदि "क्लासिक" पैडिंग स्निपेट द्वारा, आपका मतलब है कि 'mcrypt_encrypt' पर नोट्स के शीर्ष पर दाईं ओर उल्लिखित एक है, जो मुझे PHP से आपके' सी # 'परिणाम देता है। ध्यान दें कि स्निपेट ईसीबी का उपयोग करता है, सीबीसी नहीं, इसलिए आपको इसे ट्विक करने की आवश्यकता है। –

+0

आपकी टिप्पणियों के लिए धन्यवाद दोस्तों। मैंने पैडिंग के लिए इस्तेमाल किए गए कोड का विस्तृत विवरण दिया है। मैं जॉन के लिंक में देखूंगा। – karlipoppins

उत्तर

4

आप एक "क्लासिक" गद्दी टुकड़ा कोशिश कर उल्लेख किया है। mcrypt_encrypt documentation पर पोस्ट किए गए स्निपेट का निम्न त्वरित अनुकूलन आपको वही परिणाम देता है जो आप सी # से प्राप्त कर रहे थे।

पीकेसीएस # 7 (सी #द्वारा उपयोग की जाने वाली डिफ़ॉल्ट पैडिंग योजना) बाइट्स के साथ पैड जहां प्रत्येक पैडिंग बाइट का मान पैडिंग के बाइट्स की संख्या के समान होता है, न कि शून्य बाइट्स के साथ।

function get_encrypted_key($key) 
{ 
    $salt = 'abcdefgh'; 
    $block = mcrypt_get_block_size('des', 'cbc'); 
    $pad = $block - (strlen($key) % $block); 
    $key .= str_repeat(chr($pad), $pad); 

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

टेस्ट उत्पादन:

php > echo get_encrypted_key('Benjamin Franklin'); 
0b3c6e5df5d747fb3c50de952fece3999768f35b890bc391 
php > echo get_encrypted_key('President Franklin D Roosevelt'); 
c119b50a5a7f8c905a86a43f5694b4d7dd1e8d0577f1ceb32a86fabcea5711e1 
+0

धन्यवाद जॉन बहुत, यह सही है – karlipoppins