簡體   English   中英

CryptoJS 等效於 PHP 使用 openssl 方法

[英]CryptoJS equivalent in PHP using openssl method

我創建這個問題是為了分享一個 PHP 版本(基於AES Encrypt 中 CryptoJS 額外參數的版本。如何使用 PHP 復制? )的腳本具有與 CryptoJS 相同的返回,Z2FEC3923204A5C293AC138DA 中的這個版本不再使用 878方法(在 PHP 7.1.0 之后已棄用)

<?php

class CryptoJS {
    const ALGO_METHOD = 'AES-256-CBC';

    public static function encrypt(string $plaintext, string $password) {
        $salt = substr(md5(mt_rand(), true), 8);

        $block = openssl_cipher_iv_length(self::ALGO_METHOD);
        $pad = $block - (strlen($plaintext) % $block);

        $data = $plaintext . str_repeat(chr($pad), $pad);

        $iv_len = openssl_cipher_iv_length(self::ALGO_METHOD);
        $key_len =  $iv_len * 2;

        $total_len = $key_len + $iv_len;

        $salted = '';
        $dx = '';

        while (strlen($salted) < $total_len) {
            $dx = md5($dx . $password . $salt, true);
            $salted .= $dx;
        }

        $key = substr($salted, 0, $key_len);
        $iv = substr($salted, $key_len, $iv_len);

        $encrypted_data = openssl_encrypt($data, self::ALGO_METHOD, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

        return base64_encode('Salted__' . $salt . $encrypted_data);
    }

    public static function decrypt(string $edata, string $pass) {
        $data = base64_decode($edata);

        $salt = substr($data, 8, 8);

        $ct = substr($data, 16);

        $rounds = 3;
        $data00 = $pass . $salt;

        $md5_hash = array();
        $md5_hash[0] = md5($data00, true);

        $result = $md5_hash[0];
        for ($i = 1; $i < $rounds; $i++) {
            $md5_hash[$i] = md5($md5_hash[$i - 1] . $data00, true);
            $result .= $md5_hash[$i];
        }

        $key = substr($result, 0, 32);
        $iv = substr($result, 32, 16);

        return openssl_decrypt($ct, self::ALGO_METHOD, $key, true, $iv);
    }
}

$pass = $text = '{TextAndPass}';

$encrypted = CryptoJS::encrypt($text, $pass);
$decrypted = CryptoJS::decrypt($encrypted, $pass);

var_dump($encrypted, $decrypted);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM