के साथ मैक्रिप्ट को बदलें वर्तमान में हमारे पास हमारे PHP अनुप्रयोग में कुछ समझदार डेटा को क्रिप्ट करने के लिए हमारे सिस्टम पर एक मैक्रिप्ट इम्प्लांटेशन है। अब हमारे पास एक नई आवश्यकता है कि हमें क्रिप्ट मॉड्यूल को openssl में बदलना होगा। एक और चीज जो महत्वपूर्ण है, यह है कि हम सिफर ब्लाफिश और मोड ecb का उपयोग कर रहे हैं। इसलिए मैंने परीक्षण करना शुरू किया कि अंतर क्या हैं और मैं openssl के साथ एन्क्रिप्टेड स्ट्रिंग्स को मैक्रिप्ट कैसे कर सकता हूं।ओपनएसएसएल
- mcrypt_encrypt बनाम openssl_encrypt
- mcrypt_decrypt बनाम openssl_decrypt
दोनों ही तरीकों से प्रदान कर रहे हैं अलग-अलग परिणाम:
मैं मानक PHP समारोह का इस्तेमाल किया। दूसरी बात यह है कि दिए गए सिफर (ब्लाफिश) और मोड (ecb) में दोनों प्रकार के अलग-अलग IV lengthes आवश्यक हैं (openssl = 0 और mcrypt = 56)।
क्या कोई जानता है कि बड़े प्रवासन प्रयास किए बिना मैं आसानी से मॉड्यूल कैसे बदल सकता हूं?
अग्रिम धन्यवाद!
अद्यतन:
यहाँ कोड है, जो मैं यह परीक्षण किया है:
<?php
function say($message){
if(!is_string($message)){
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "<pre>";
echo var_export($message, true) . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "</pre>";
}else{
echo $message . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
}
}
say("= Begin raw encryption");
$key = "anotherpass";
$str = "does it work";
say(" Params:");
say(" - String to encrypt '".$str."'");
say(" - Key: ".$key);
say("");
$params = array(
"openssl" => array(
"cipher" => "BF",
"mode" => "ECB",
),
"mcrypt" => array(
"cipher" => "blowfish",
"mode" => "ecb",
),
);
say("= Mcrypt");
$handler = mcrypt_module_open($params['mcrypt']['cipher'], '', $params['mcrypt']['mode'], '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($handler), MCRYPT_RAND);
$keysize = mcrypt_enc_get_key_size($handler);
mcrypt_generic_init($handler,$key,"\0\0\0\0\0\0\0\0");
say(" Params:");
say(" - InitVector ".bin2hex($iv)." (bin2hex)");
say(" - Max keysize ".$keysize);
say(" - Cipher ".$params['mcrypt']['cipher']);
say(" - Mode ".$params['mcrypt']['mode']);
say("");
say(" Encryption:");
$m_encrypted = mcrypt_generic($handler, $str);
$m_decrypted = mdecrypt_generic($handler, $m_encrypted);
say(" - Encrypted ".bin2hex($m_encrypted)." (bin2hex)");
say(" - Descrypted ".$m_decrypted);
say("");
say("= Openssl");
say(" Params:");
say(" - InitVector not needed");
say(" - Max keysize ".openssl_cipher_iv_length($params['openssl']['cipher']."-".$params['openssl']['mode']));
say(" - Cipher ".$params['openssl']['cipher']);
say(" - Mode ".$params['openssl']['mode']);
say("");
say(" Encryption:");
$o_encrypted = openssl_encrypt($str,$params['openssl']['cipher']."-".$params['openssl']['mode'],$key,true);
$o_decrypted = openssl_decrypt($o_encrypted,$params['openssl']['cipher']."-".$params['openssl']['mode'],$key,true);
say(" - Encrypted ".bin2hex($o_encrypted)." (bin2hex)");
say(" - Descrypted ".$o_decrypted);
और ये मेरे परिणाम है:
= Begin raw encryption
Params:
- String to encrypt 'does it work'
- Key: anotherpass
= Mcrypt
Params:
- InitVector 06a184909d7bf863 (bin2hex)
- Max keysize 56
- Cipher blowfish
- Mode ecb
Encryption:
- Encrypted 0e93dce9a6a88e343fe5f90d1307684c (bin2hex)
- Descrypted does it work
= Openssl
Params:
- InitVector not needed
- Max keysize 0
- Cipher BF
- Mode ECB
Encryption:
- Encrypted 213460aade8f9c14d8d51947b8231439 (bin2hex)
- Descrypted does it work
हो सकता है कि किसी भी विचार अब?
धन्यवाद!
आप या तो एक प्रवास स्क्रिप्ट mcrypt का उपयोग कर मौजूदा डेटा decrypts चलाने के लिए होगा और फिर इसे फिर से एन्क्रिप्ट करता है वरना आप openssl का उपयोग कर, या ' आपको एक विधि को कार्यान्वित करने की आवश्यकता होगी जिसके द्वारा आप जानते हैं कि डेटा के प्रत्येक आइटम के लिए कौन सी एन्क्रिप्शन/डिक्रिप्शन फ़ंक्शंस का उपयोग करना है, और मैक्रिप्ट का उपयोग करके एन्क्रिप्टेड कुछ डेटा तक पहुंचने पर आवश्यकतानुसार उन्हें mcrypt से openssl में बदलना आवश्यक है। – Jon
जैसा कि मैं इसे समझता हूं, mcrypt और open_ssl विभिन्न कुंजी व्युत्पन्न विधियों का उपयोग करते हैं और इसलिए जॉन सही है, आपको या तो डिक्रिप्ट द्वारा माइग्रेट करने की आवश्यकता होगी, फिर डेटा एन्क्रिप्ट या चिह्नित करें ताकि इसे माइग्रेट किया जा सके क्योंकि इसे अगली एक्सेस किया गया है। –
मुझे आश्चर्य है कि ईसीबी मोड में आईबी की आवश्यकता क्यों है। Http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation पर ईसीबी मोड का विवरण देखें। – doptimusprime