2017-07-20 12 views
5

के बाद से Mcrypt हटाई गई है, मैं के बाद से हम पहले से ही php 7.0.17 हमारे सर्वर में उपयोग करने के बजाय मेरी कोड में OpenSSL का उपयोग करना चाहते हैं और वहाँ कोई बताती हैं कि यह उन्नयन है ।mcrypt क्रिप्ट -128 OpenSSL को एईएस 128-ईसीबी रूपांतरण

कुछ तीसरे पक्ष एपीआई (पीएचपी 5.x शायद और mcrypt के प्रयोग पर आयोजित), एन्क्रिप्टेड डाटा ले जा रहा है। उन्होंने विधियों को एन्क्रिप्ट/डिक्रिप्ट करने के लिए उपयोग की जाने वाली विधियां प्रदान की हैं।

यहाँ वे

$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ; 

public function encrypt128($str) 
    { 
     $block = mcrypt_get_block_size("rijndael_128", "ecb"); 
     $pad = $block - (strlen($str) % $block); 
     $str .= str_repeat(chr($pad), $pad); 

     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB)); 
    } 

public function decrypt128($str) 
    { 
     $str = base64_decode($str); 
     $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB); 

     $len = strlen($str); 
     $pad = ord($str[$len - 1]); 

     return substr($str, 0, strlen($str) - $pad); 
    } 

इन तरीकों स्ट्रिंग small1 का उपयोग कर यदि एन्क्रिप्टेड हो जाता है v7IXp5vVaFVXXlt/MN8BVw==


हम अपने पक्ष में openssl_encrypt उपयोग करने के लिए इस तरह के हैं कि अगर हम OpenSSL के साथ एक ही स्ट्रिंग एन्क्रिप्ट यह देना चाहिए चाहते हैं मैक्रिप्ट के समान परिणाम। मैंने शोध किया है कि का उपयोग करके mcrypt rijndael-128 मोड ecb ओपनएसएसएल aes-128-ecb के साथ संगत होना चाहिए।

पिछले कुछ घंटों के लिए, मैं OpenSSL का उपयोग कर उसी परिणाम की सेवा करने वाले तारों को एन्क्रिप्ट करने के लिए अपनी स्वयं की विधि बनाने की कोशिश कर रहा हूं। अब तक मैं इस

public function sslEncrypt128($str) 
{ 
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c'; 
    return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA)); 
} 

पर आए हैं लेकिन यह इनपुट से ऊपर के रूप में ही अलग-अलग स्ट्रिंग SxJ3+EdaeItZx3/EwGTUbw== पैदा करता है। मुझे नहीं पता कि यह ध्वज की समस्या है या पैडिंग है, किसी भी पॉइंटर्स का स्वागत होगा।

मैं ऑनलाइन अग्रिम में https://3v4l.org/v2J2N

धन्यवाद परीक्षण करने के लिए यहाँ कोड जोड़ दिया है।

+1

ईसीबी मोड में कुछ गंभीर सुरक्षा समस्याएं हैं। ** बहुत ** सुनिश्चित करें कि यह आपके विशिष्ट एप्लिकेशन के लिए उपयुक्त है। आम तौर पर सीबीसी मोड या सीटीआर मोड अधिक सुरक्षित होगा। समस्या के एक उदाहरण (शाब्दिक) के लिए [इलेक्ट्रॉनिक कोडबुक] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.290) देखें। – rossum

+0

यह भी देखें [मैक्रिप्ट से ओपनएसएसएल तक मेरी एन्क्रिप्शन लाइब्रेरी को अपग्रेड करना] (http://stackoverflow.com/q/43329513/608639), [ओपनएसएसएल के साथ मैक्रिप्ट को बदलें] (http://stackoverflow.com/q/9993909/608639) और [PHP 7.2 में मैक्रिप्ट को हटाने के लिए तैयारी कर रहा है] (http://stackoverflow.com/q/42696657/608639), [3DES-ECB एन्क्रिप्शन के लिए मैक्रिप्ट को प्रतिस्थापित करने के लिए openssl_encrypt का उपयोग करें] (https://stackoverflow.com/q/ 3 9467008/608639) (यह ईसीएम मोड का उपयोग करता है)। – jww

+0

नोट: बेस 64 डेटा कंप्यूटर के लिए ठीक है लेकिन डेवलपर्स के लिए डेटा से कुछ भी समझने के लिए प्रति-बाइट प्रतिनिधित्व की आवश्यकता है, हेक्स उस आवश्यकता को पूरा करता है, बेस 64 नहीं करता है। – zaph

उत्तर

2

अपने विशिष्ट उदाहरण में मैं मैंने पाया है कि चा द्वारा aes-128-ecb से aes-256-ecb, यह विरासत mcrypt_encrypt के समान उत्पादन का उत्पादन करता है।

+0

मेरा मानना ​​है कि मैक्रिप्ट 128, 1 9 2 और 256 बिट्स के ब्लॉक आकार * प्रदान करता है। एईएस केवल 128 ब्लॉक आकार प्रदान करता है। मेरा अनुमान है, 'MCRYPT_RIJNDAEL_128' शायद 128-बिट ब्लॉक आकार के साथ रिजेंडेल का जिक्र कर रहा है, जो एईएस है। मुख्य आकार एक अलग मामला है, और ओपनएसएसएल के 'एईएस -256-सीबीसी' में '256' दर्शाता है। यदि एक मानक क्रिप्टोग्राफिक एल्गोरिदम नाम (एससीएएन) का उपयोग करते हैं, तो सिफर उदाहरण के लिए मैक्रिप्ट एल्गोरिदम नाम 'रिजेंडेल-128 (256)/सीबीसी' के समान होगा। – jww

2

अधिकतर कुंजी हेक्स के रूप में उपयोग होने की उम्मीद थी (यह पहले से ही हेक्स प्रारूप में है) हेक्स में परिवर्तित करने के लिए एक स्ट्रिंग के रूप में नहीं।


mcrypt:

mcrypt मानक PKCS # 7 (उर्फ़ PKCS # 5) गद्दी, केवल गैर मानक अशक्त गद्दी लेकिन गद्दी स्पष्ट mcrypt से पहले जोड़ा जा रहा है समर्थन नहीं करता।

एन्क्रिप्शन v7IXp5vVaFVXXlt/MN8BVw== पीकेसीएस # 7 पैडिंग के आधार पर सही एन्क्रिप्शन है। ईसीबी मोड और एक स्ट्रिंग के रूप में कुंजी।

देखें: mcrypt - AES CALCULATOR

हेक्स में, ध्यान दें डेटा गद्दी स्पष्ट रूप से दिख रहा है:
key: 6130613765373939376236643566636435356634623563333236313162383763
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: BFB217A79BD56855575E5B7F30DF0157

Base64 में:
encrypted: v7IXp5vVaFVXXlt/MN8BVw==


OpenSSL:

ध्यान दें कि कुंजी 256-बिट्स है लेकिन "एएस-128-ecb" के साथ ओपनएसएसएल कॉल 128-लेकिन कुंजी का संकेत देती है। तो चाबियाँ मेल नहीं खाते हैं।

देखें: OpenSSL - AES CALCULATOR

हेक्स में, ध्यान दें डेटा गद्दी स्पष्ट रूप से दिखाई दे रहा है:
key: 61306137653739393762366435666364
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: 4B1277F8475A788B59C77FC4C064D46F

Base64 में:
encrypted: SxJ3+EdaeItZx3/EwGTUbw==

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