2010-08-07 7 views
9

UPDATEDरिजेंडेल 256 सी # और PHP के बीच एन्क्रिप्ट/डिक्रिप्ट?

मैं तो यह) को 256 के एक ब्लॉक आकार का उपयोग करता है, लेकिन अब हैलो दुनिया इस http://pastebin.com/5sXhMV11 तरह लग रहा है और मैं यह पता लगाने नहीं कर सकते कि मैं क्या rtrim साथ इस्तेमाल करना चाहिए (सी # कोड में परिवर्तन किए हैं अंत में गंदगी की सवारी करें।

जब भी आप कहते हैं कि चतुर्थ यादृच्छिक होना चाहिए, तो इसका मतलब है कि आप एक ही चतुर्थ का उपयोग नहीं करते हैं, फिर एक बार या जिस तरह से मैंने इसे गलत कोड किया है?

फिर से धन्यवाद!

हाय,

मैं PHP कि सी # में एन्क्रिप्ट किया गया था के साथ एक स्ट्रिंग डिक्रिप्ट करने के लिए कोशिश कर रहा हूँ। मुझे mcrypt का उपयोग करके इसे डिक्रिप्ट करने के लिए PHP नहीं मिल रहा है और कृपया कुछ मदद के साथ कर सकता है। मुझे php के साथ निम्न त्रुटि मिलती है, इसलिए मुझे लगता है कि मैं IV को सही ढंग से सेट नहीं कर रहा हूं।

त्रुटि: चतुर्थ पैरामीटर ब्लॉकसाइज

दोनों कार्यों का उपयोग के रूप में लंबे समय के रूप में होना चाहिए एक ही सिफर, कुंजी, चतुर्थ और सीबीसी मोड पर सेट:

एन्क्रिप्टेड पाठ से ग # = UmzUCnAzThH0nMkIuMisqg ==
कुंजी 32 लंबे = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 लंबे = 123456789

सी #

public static string EncryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); 
     byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); 

     string encrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 

     try 
     { 
      MemoryStream ms = new MemoryStream(); 

      using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       using (StreamWriter sw = new StreamWriter(cs)) 
       { 
        sw.Write(message); 
        sw.Close(); 
       } 
       cs.Close(); 
      } 
      byte[] encoded = ms.ToArray(); 
      encrypted = Convert.ToBase64String(encoded); 

      ms.Close(); 
     } 
     catch (CryptographicException e) 
     { 
      Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (UnauthorizedAccessException e) 
     { 
      Console.WriteLine("A file error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: {0}", e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 

     return encrypted; 
    } 

पीएचपी

var $mcrypt_cipher = MCRYPT_RIJNDAEL_256; 
var $mcrypt_mode = MCRYPT_MODE_CBC; 

function decrypt($key, $iv, $encrypted) 
{ 
    $encrypted = base64_decode($encrypted); 

    $decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");; 
    return $decrypted; 
} 

धन्यवाद

+1

चतुर्थ वास्तव में यादृच्छिक होना चाहिए। यह एक होने के उद्देश्य को हरा देता है यदि यह नहीं है। – quantumSoup

+0

256-बिट ब्लॉक के साथ रिजेंडेल गैर-मानक है। – kroiz

उत्तर

10

आप 256.

RijndaelManaged rj = new RijndaelManaged(); 
rj.BlockSize = 256; 

को blocksize स्थापित करने के लिए और फिर अपने iv है है तो आप अपने सी # आवेदन में Rijndael256 उपयोग करना चाहते हैं 256 बिट लंबे समय तक होने के लिए।
देख SymmetricAlgorithm.BlockSize Property


अथवा इसके विपरीत: वर्तमान में अपने सी # आवेदन Rijndael128 अपने PHP स्क्रिप्ट चाहिए का उपयोग करता है और इसलिए।

<?php 
class Foo { 
    protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128; 
    protected $mcrypt_mode = MCRYPT_MODE_CBC; 

    public function decrypt($key, $iv, $encrypted) 
    { 
    $iv_utf = mb_convert_encoding($iv, 'UTF-8'); 
    return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf); 
    } 
} 



$encrypted = "UmzUCnAzThH0nMkIuMisqg=="; 
$key = "qwertyuiopasdfghjklzxcvbnmqwerty"; 
$iv = "123456789"; 

$foo = new Foo; 
echo $foo->decrypt($key, $iv, $encrypted); 

प्रिंट hello world

+3

मुझे पता है कि यह आपकी गलती नहीं है, लेकिन चतुर्थ वास्तव में यादृच्छिक होना चाहिए। यह एक होने के उद्देश्य को हरा देता है यदि यह नहीं है। – quantumSoup

+1

सहमत हुए। http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.generateiv.aspx और http://docs.php.net/function.mcrypt-create-iv – VolkerK

+0

देख सकते हैं कृपया यह? http://stackoverflow.com/questions/18908613/mcrypt-and-base64-with-php-and-c-sharp – hsuk

-1

एन्क्रिप्ट PHP का उपयोग;

/Generate public key for encrytion 
$path = "keys/"; 

    $crt = openssl_x509_read(file_get_contents($path."cert.crt")); 
    $publickey = openssl_get_publickey($crt); 

    //Encrypt using public key 
    openssl_public_encrypt($source, $crypted, $publickey); 

    //openssl_private_encrypt($source, $crypted, $privkey); 
    echo base64_encode($crypted); 

डिक्रिप्ट सी #

X509Certificate2 x509cert = new X509Certificate2(pKeyFilename); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 
    RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)x509cert.PrivateKey;     

    byte[] decrypted = crypt.Decrypt(Convert.FromBase64String(data), false); 
    return ASCIIEncoding.UTF8.GetString(decrypted); 

जहां pKeyFilename एक व्यक्तिगत जानकारी एक्सचेंज प्रमाणपत्र फ़ाइल cert.crt के साथ बनाई गई फ़ाइल का उपयोग करते हुए। यह उदाहरण एईएस -256 एन्क्रिप्शन का उपयोग करता है।

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