2012-04-03 14 views
14

के साथ मैक्रिप्ट को बदलें वर्तमान में हमारे पास हमारे 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 

हो सकता है कि किसी भी विचार अब?

धन्यवाद!

+7

आप या तो एक प्रवास स्क्रिप्ट mcrypt का उपयोग कर मौजूदा डेटा decrypts चलाने के लिए होगा और फिर इसे फिर से एन्क्रिप्ट करता है वरना आप openssl का उपयोग कर, या ' आपको एक विधि को कार्यान्वित करने की आवश्यकता होगी जिसके द्वारा आप जानते हैं कि डेटा के प्रत्येक आइटम के लिए कौन सी एन्क्रिप्शन/डिक्रिप्शन फ़ंक्शंस का उपयोग करना है, और मैक्रिप्ट का उपयोग करके एन्क्रिप्टेड कुछ डेटा तक पहुंचने पर आवश्यकतानुसार उन्हें mcrypt से openssl में बदलना आवश्यक है। – Jon

+1

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

+0

मुझे आश्चर्य है कि ईसीबी मोड में आईबी की आवश्यकता क्यों है। Http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation पर ईसीबी मोड का विवरण देखें। – doptimusprime

उत्तर

8

ब्लोफिश ब्लॉक साइफर है। एन्क्रिप्शन से पहले डेटा को पैड किए जाने की आवश्यकता होती है। ओपनएसएसएल पीकेसीएस # 7 का उपयोग करता है और मैक्रिप्ट पीकेसीएस # 5 का उपयोग करता है। डेटा के लिए अलग पैडिंग algorythms। पीकेसीएस # 7 के लिए न्यूनतम पीकेसीएस # 5 पैडिंग लंबाई 0 है, यह 1 (wikipedia) है। इस उदाहरण पर एक नजर डालें (मैं जो PKCS # mcrypt_encrypt() के लिए मैन्युअल रूप से गद्देदार इनपुट डेटा है 7 शैली):

<?php 

$key = "anotherpassword1"; 
$str = "does it work 12"; 

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."\1", MCRYPT_MODE_ECB); 
$dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB); 
echo(bin2hex($enc).PHP_EOL); 
var_dump($dec); 

$enc = openssl_encrypt($str, 'bf-ecb', $key, true); 
$dec = openssl_decrypt($enc, 'bf-ecb', $key, true); 
echo(bin2hex($enc).PHP_EOL); 
var_dump($dec); 

?> 

यह() mcrypt_encrypt (साथ एन्क्रिप्टेड डाटा), openssl_decrypt जब तक मैनुअल डेटा गद्दी साथ किया गया था असंभव है mcrypt_encrypt() से पहले पीकेसीएस # 7 को बुलाया गया था।

आपके मामले में केवल एक ही रास्ता है - डेटा को दोबारा दोहराएं।

पुनश्च: वहाँ अपने स्रोत में कोई त्रुटि है - ईसीबी मोड सभी (wikipedia)

+1

धन्यवाद, इस संकेत ने मुझे माइक्रिप्ट और ओपनएसएसएल के बीच रिजेंडेल-128/एईएस-128 संगत बनाने में मदद की। दुर्भाग्यवश, यह ब्लोफिश - – Narf

+0

के लिए काम नहीं करता है, यह ब्लॉफिश के लिए काम करता है, लेकिन मुख्य आकार कम से कम 16 बाइट्स होना चाहिए (Blowfish के लिए विकिपीडिया लेख कहता है कि यह कम समर्थन करता है)। – Narf

+0

यह पीकेसीएस # 7 – clover

1

कम कुंजी के लिए कम से चतुर्थ का उपयोग करता है नहीं है, आप openssl के लिए साइकिल बनाने चाहिए चाबियाँ जब mcrypt के ब्लोफिश पलायन।

function make_openssl_blowfish_key($key) 
{ 
    if("$key" === '') 
     return $key; 

    $len = (16+2) * 4; 
    while(strlen($key) < $len) { 
     $key .= $key; 
    } 
    $key = substr($key, 0, $len); 
    return $key; 
} 

देखें: https://bugs.php.net/bug.php?id=72362

देखें: Moving from mcrypt with Blowfish & ECB to OpenSSL

-1

@clover सही है कि ब्लोफिश के लिए डिफ़ॉल्ट गद्दी mcrypt और openssl के बीच अलग है, लेकिन वह यह नहीं किया जा सकता गलत है।आप डिक्रिप्ट के लिए OPENSSL_ZERO_PADDING विकल्प का उपयोग करते दो वास्तव में संगत कर रहे हैं:

openssl_decrypt($data, 'bf-ecb', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); 
+0

'OPENSSL_ZERO_PADDING' कोई पैडिंग नहीं जोड़ता है, किसी गैर-मानक पैडिंग को मैन्युअल रूप से पहले जोड़ना होगा एन्क्रिप्शन और डिक्रिप्शन पर हटा दिया। दस्तावेज़ों [openssl_encrypt] से (https://secure.php.net/manual/en/function.openssl-encrypt.php), शायद आप एक अलग संस्करण का उपयोग कर रहे हैं। दस्तावेज़ टिप्पणियों से: इसलिए, OPENSSL_ZERO_PADDING संदर्भ के लिए पैडिंग अक्षम करता है, जिसका अर्थ है कि आपको ब्लॉक आकार में मैन्युअल रूप से अपना पैडिंग लागू करना होगा। OPENSSL_ZERO_PADDING का उपयोग किए बिना, आपको स्वचालित रूप से PKCS # 7 पैडिंग मिल जाएगी। – zaph

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