खोज…


टिप्पणियों

/* Base64 Encoded Encryption / $enc_data = base64_encode( openssl_encrypt($data, $method, $password, true, $iv) ); / Decode and Decrypt */ $dec_data = base64_decode( openssl_decrypt($enc_data, $method, $password, true, $iv) );

एन्क्रिप्शन और एन्कोडिंग करने का यह तरीका काम नहीं करेगा जैसा कि आप बेस 64 को अनएन्कोड करने से पहले कोड को डिक्रिप्ट कर रहे हैं।

आपको इसके विपरीत क्रम में करने की आवश्यकता होगी।

/ This way instead / $enc_data=base64_encode(openssl_encrypt($data, $method, $pass, true, $iv)); $dec_data=openssl_decrypt(base64_decode($enc_data), $method, $pass, true, $iv);

सममित सिफर

यह उदाहरण CBC मोड में AES 256 सममितीय सिफर दिखाता है। एक आरंभीकरण वेक्टर की आवश्यकता होती है, इसलिए हम एक ओपनसेल फ़ंक्शन का उपयोग करके उत्पन्न करते हैं। चर $strong का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या IV उत्पन्न क्रिप्टोग्राफिक रूप से मजबूत था।

एन्क्रिप्शन

$method = "aes-256-cbc"; // cipher method
$iv_length = openssl_cipher_iv_length($method); // obtain required IV length
$strong = false; // set to false for next line
$iv = openssl_random_pseudo_bytes($iv_length, $strong); // generate initialization vector

/* NOTE: The IV needs to be retrieved later, so store it in a database.
However, do not reuse the same IV to encrypt the data again. */

if(!$strong) { // throw exception if the IV is not cryptographically strong
    throw new Exception("IV not cryptographically strong!");
}

$data = "This is a message to be secured."; // Our secret message
$pass = "Stack0verfl0w"; // Our password

/* NOTE: Password should be submitted through POST over an HTTPS session.
Here, it's being stored in a variable for demonstration purposes. */

$enc_data = openssl_encrypt($data, $method, $password, true, $iv); // Encrypt

डिक्रिप्शन

/* Retrieve the IV from the database and the password from a POST request */
$dec_data = openssl_decrypt($enc_data, $method, $pass, true, $iv); // Decrypt

बेस 64 एनकोड और डिकोड

यदि एन्क्रिप्ट किए गए डेटा को प्रिंट करने योग्य पाठ में भेजने या संग्रहीत करने की आवश्यकता है, तो क्रमशः base64_encode() और base64_decode() फ़ंक्शन का उपयोग किया जाना चाहिए।

/* Base64 Encoded Encryption */
$enc_data = base64_encode(openssl_encrypt($data, $method, $password, true, $iv));

/* Decode and Decrypt */
$dec_data = openssl_decrypt(base64_decode($enc_data), $method, $password, true, $iv);

ओपनएसएसएल के साथ बड़ी फ़ाइलों की सममित एन्क्रिप्शन और डिक्रिप्शन

बड़ी फ़ाइलों को एन्क्रिप्ट और डिक्रिप्ट करने के लिए PHP में बिल्ड-इन फ़ंक्शन का अभाव है। openssl_encrypt का उपयोग स्ट्रिंग्स को एन्क्रिप्ट करने के लिए किया जा सकता है, लेकिन एक बड़ी फ़ाइल को मेमोरी में लोड करना एक बुरा विचार है।

इसलिए हमें ऐसा करने के लिए एक यूजरलैंड फ़ंक्शन लिखना होगा। यह उदाहरण एक बड़ी फ़ाइल के छोटे विखंडन को एन्क्रिप्ट करने के लिए सममित AES-128-CBC एल्गोरिथ्म का उपयोग करता है और उन्हें किसी अन्य फ़ाइल में लिखता है।

फ़ाइलें एन्क्रिप्ट करें

/**
 * Define the number of blocks that should be read from the source file for each chunk.
 * For 'AES-128-CBC' each block consist of 16 bytes.
 * So if we read 10,000 blocks we load 160kb into memory. You may adjust this value
 * to read/write shorter or longer chunks.
 */
define('FILE_ENCRYPTION_BLOCKS', 10000);

/**
 * Encrypt the passed file and saves the result in a new file with ".enc" as suffix.
 * 
 * @param string $source Path to file that should be encrypted
 * @param string $key    The key used for the encryption
 * @param string $dest   File name where the encryped file should be written to.
 * @return string|false  Returns the file name that has been created or FALSE if an error occured
 */
function encryptFile($source, $key, $dest)
{
    $key = substr(sha1($key, true), 0, 16);
    $iv = openssl_random_pseudo_bytes(16);

    $error = false;
    if ($fpOut = fopen($dest, 'w')) {
        // Put the initialzation vector to the beginning of the file
        fwrite($fpOut, $iv);
        if ($fpIn = fopen($source, 'rb')) {
            while (!feof($fpIn)) {
                $plaintext = fread($fpIn, 16 * FILE_ENCRYPTION_BLOCKS);
                $ciphertext = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
                // Use the first 16 bytes of the ciphertext as the next initialization vector
                $iv = substr($ciphertext, 0, 16);
                fwrite($fpOut, $ciphertext);
            }
            fclose($fpIn);
        } else {
            $error = true;
        }
        fclose($fpOut);
    } else {
        $error = true;
    }

    return $error ? false : $dest;
}

फ़ाइलों को डिक्रिप्ट करें

उपरोक्त फ़ंक्शन के साथ एन्क्रिप्ट की गई फ़ाइलों को डिक्रिप्ट करने के लिए आप इस फ़ंक्शन का उपयोग कर सकते हैं।

/**
 * Dencrypt the passed file and saves the result in a new file, removing the
 * last 4 characters from file name.
 * 
 * @param string $source Path to file that should be decrypted
 * @param string $key    The key used for the decryption (must be the same as for encryption)
 * @param string $dest   File name where the decryped file should be written to.
 * @return string|false  Returns the file name that has been created or FALSE if an error occured
 */
function decryptFile($source, $key, $dest)
{
    $key = substr(sha1($key, true), 0, 16);

    $error = false;
    if ($fpOut = fopen($dest, 'w')) {
        if ($fpIn = fopen($source, 'rb')) {
            // Get the initialzation vector from the beginning of the file
            $iv = fread($fpIn, 16);
            while (!feof($fpIn)) {
                $ciphertext = fread($fpIn, 16 * (FILE_ENCRYPTION_BLOCKS + 1)); // we have to read one block more for decrypting than for encrypting
                $plaintext = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
                // Use the first 16 bytes of the ciphertext as the next initialization vector
                $iv = substr($ciphertext, 0, 16);
                fwrite($fpOut, $plaintext);
            }
            fclose($fpIn);
        } else {
            $error = true;
        }
        fclose($fpOut);
    } else {
        $error = true;
    }

    return $error ? false : $dest;
}

कैसे इस्तेमाल करे

यदि आपको यह देखने के लिए एक छोटे स्निपेट की आवश्यकता है कि यह कैसे काम करता है या उपरोक्त कार्यों का परीक्षण करने के लिए, निम्नलिखित कोड को देखें।

$fileName = __DIR__.'/testfile.txt';
$key = 'my secret key';
file_put_contents($fileName, 'Hello World, here I am.');
encryptFile($fileName, $key, $fileName . '.enc');
decryptFile($fileName . '.enc', $key, $fileName . '.dec');

यह तीन फाइलें बनाएगा:

  1. सादे पाठ के साथ testfile.txt
  2. एन्क्रिप्टेड फ़ाइल के साथ testfile.txt.enc
  3. डिक्रिप्टेड फ़ाइल के साथ testfile.txt.dec । इसमें testfile.txt जैसी सामग्री होनी चाहिए


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow