php MCrypt rijndael-128 से OpenSSL aes-128-ecb रूपांतरण




encryption cryptography (3)

चूंकि मैक्रिप्ट को अपदस्थ किया गया है, मैं अपने कोड के बजाय ओपनएसएसएल का उपयोग करना चाहता हूं क्योंकि हम पहले से ही हमारे सर्वर में php 7.0.17 का उपयोग कर रहे हैं और जब वे इसे अपग्रेड करते हैं तो कोई भी नहीं बताता है।

कुछ थर्ड पार्टी एपीआई ( PHP 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);
    }

अगर एन्क्रिप्टेड v7IXp5vVaFVXXlt/MN8BVw== हो तो इन विधियों का उपयोग करना

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

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

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 परीक्षण करने के लिए यहां कोड जोड़ा है

अग्रिम में धन्यवाद।


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

mcrypt:

mcrypt मानक PKCS # 7 (n PKK # 5) पैडिंग का समर्थन नहीं करता है, केवल गैर-मानक नल पैडिंग है लेकिन mcrypt से पहले पैडिंग को स्पष्ट रूप से जोड़ा जा रहा है

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

देखें: mcrypt - एईएस कैलकुलर

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

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

OpenSSL:

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

देखें: ओपनएसएसएल - एईएस कैलकुलर

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

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


यहाँ मेरे लिए क्या काम किया गया है:

<?php

$str = 'Content';
if (strlen($str) % 16) {
    $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "\0");
}

$key = 'KEY';
if (strlen($key) % 16) {
    $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "\0");
}

$res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
echo strToHex($res1) . ' | mcrypt_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';

echo "<hr>";

$res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
echo strToHex($res2) . ' | openssl_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';


function strToHex($string) {
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $ord     = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex     .= substr('0' . $hexCode, -2);
    }

    return strToUpper($hex);
}

आपके विशिष्ट उदाहरण में मैंने पाया है कि aes-128-ecb को aes-128-ecb aes-256-ecb , यह वही आउटपुट पैदा करता है, जो विरासत mcrypt_encrypt रूप में mcrypt_encrypt







php-openssl