2010-03-18 14 views
5

जब मैं के साथ सी # एन्क्रिप्ट मैं arTdPqWOg6VppOqUD6mGITjb24+x5vJjfAufNQ4DN7rVEtpDmhFnMeJGg4n5y1BNtripledes एन्क्रिप्शन PHP में एक ही परिणाम और सी #

static void Main(string[] args) 
{ 
    Encoding byteEncoder = Encoding.Default; 

    String key = "ShHhd8a08JhJiho98ayslcjh"; 
    String message = "Let us meet at 9 o'clock at the secret place."; 

    String encryption = Encrypt(message, key, false); 
    String decryption = Decrypt(encryption , key, false); 

    Console.WriteLine("Message: {0}", message); 
    Console.WriteLine("Encryption: {0}", encryption); 
    Console.WriteLine("Decryption: {0}", decryption); 
} 

public static string Encrypt(string toEncrypt, string key, bool useHashing) 
{ 
    byte[] keyArray; 
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); 

    if (useHashing) 
    { 
     MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
     keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); 
    } 
    else 
     keyArray = UTF8Encoding.UTF8.GetBytes(key); 

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
    tdes.Key = keyArray; 
    tdes.Mode = CipherMode.ECB; 
    tdes.Padding = PaddingMode.PKCS7; 

    ICryptoTransform cTransform = tdes.CreateEncryptor(); 
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 

    return Convert.ToBase64String(resultArray, 0, resultArray.Length); 
} 

public static string Decrypt(string toDecrypt, string key, bool useHashing) 
{ 
    byte[] keyArray; 
    byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); 

    if (useHashing) 
    { 
     MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
     keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); 
    } 
    else 
     keyArray = UTF8Encoding.UTF8.GetBytes(key); 

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
    tdes.Key = keyArray; 
    tdes.Mode = CipherMode.ECB; 
    tdes.Padding = PaddingMode.PKCS7; 

    ICryptoTransform cTransform = tdes.CreateDecryptor(); 
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 

    return UTF8Encoding.UTF8.GetString(resultArray); 
} 

मिल जब मैं मैं पीएचपी साथ एन्क्रिप्ट उपज नहीं क्यों पता लगाने के लिए क्रिप्टोग्राफी के बारे में। कोई विचार? धन्यवाद।

+0

प्रत्येक संगत के परिणाम क्या हैं? कम से कम हैश के लिए, मेरा मानना ​​है कि वे एक यादृच्छिक नमक उत्पन्न करते हैं। – Jonah

उत्तर

6

पीटर सही है। PHP सिर्फ शून्य के साथ पैड करता है, जबकि आप सी # कोड में पीकेसीएस # 7 का उपयोग कर रहे हैं।

function pkcs7_pad($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

$input = pkcs7_pad("Let us meet at 9 o'clock at the secret place.", 16); 

फिर, आप अपने सी # कोड में यह डाल करने के लिए सक्षम होना चाहिए: यहाँ कुछ कोड कि यह सही कदम उठाएं

tdes.Padding = PaddingMode.Zeros; 

है और यह भी कि यह काम (थोड़ा कम सुरक्षित रूप से यद्यपि) है।

2

मुझे PHP नहीं पता है, और न ही मैंने आपके सी # कोड का सावधानी से विश्लेषण किया है, लेकिन अधिकांश एन्क्रिप्टेड स्ट्रिंग समान है क्योंकि डेटा का पैडिंग अंतर है? हो सकता है कि PHP सी # कोड में PaddingMode.PKCS7 से दूसरे मोड का उपयोग करे? (अगर मैं टिप्पणी कर सकता तो यह एक टिप्पणी होगी ...)

0

एक साइड नोट के रूप में: यदि आप ईसीबी का उपयोग कर रहे हैं तो आपको IV की आवश्यकता नहीं है। दरअसल, ईसीबी का उपयोग अधिकांश समय सुरक्षा खतरे में होता है, इसलिए आपको वास्तव में कुछ और उपयोग करने की आवश्यकता होती है, उदा। सीबीसी, जो एक चतुर्थ का उपयोग करता है। चतुर्थ सिफर ब्लॉक आकार (3 डीईएस के लिए 8 बाइट्स) की तुलना में एक ही आकार के साथ एक यादृच्छिक, गैर-गुप्त मूल्य है। प्रत्येक संदेश के लिए एक नया चौथाई बनाया जाना चाहिए, और डिक्रिप्टिंग पार्टी को यह पता होना चाहिए कि एन्क्रिप्टिंग पार्टी का उपयोग किया गया था। अभ्यास में, चतुर्थ एन्क्रिप्टेड संदेश के साथ भेजा जाता है।

संबंधित मुद्दे