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




encryption cryptography (2)

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

चूंकि मैक्रिप्ट को अपदस्थ किया गया है, मैं अपने कोड के बजाय ओपनएसएसएल का उपयोग करना चाहता हूं क्योंकि हम पहले से ही हमारे सर्वर में 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 परीक्षण करने के लिए यहां कोड जोड़ा है

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


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

<?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);
}






php-openssl