Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel-Tutorial zur AES-Verschlüsselung (Kapselung) von Ecshop

Beispiel-Tutorial zur AES-Verschlüsselung (Kapselung) von Ecshop

零下一度
零下一度Original
2017-06-28 10:38:511514Durchsuche

Von einem Unternehmen, das Shopex und Ecstore betreibt, zu einem Unternehmen, das B2B-Ecshop betreibt ... Es ist an der Zeit, es in die Praxis umzusetzen. Lassen Sie uns zunächst verstehen, was die AES-Verschlüsselung von PHP ist.

aes (Advanced Encryption Standard), die Blocklänge von AES ist auf 128 Bit festgelegt und die Schlüssellänge kann 128, 192 oder 256 Bit betragen; es handelt sich um eine reversible Verschlüsselungsmethode, die sich von MD5 unterscheidet.

AES ist in mehrere Modi unterteilt, z. B. ECB, CBC, CFB usw. Mit Ausnahme von ECB, das nicht sehr sicher ist, da es kein IV verwendet, ist der Unterschied zwischen den anderen Modi nicht allzu offensichtlich Die Unterschiede bestehen zwischen IV und Die Methode zur Berechnung des Chiffretexts durch KEY unterscheidet sich geringfügig.

Welche Rolle spielt die Infusion?

IV wird als Anfangsvektor bezeichnet. Die Verschlüsselung und Entschlüsselung erfordern den gleichen IV. Für diesen Zweck gibt es einen weiteren IV In jedem Block bleibt der Schlüssel unverändert, aber nur die IV des ersten Blocks wird vom Benutzer bereitgestellt, und die IVs der anderen Blöcke werden automatisch generiert.
Die Länge von IV beträgt 16 Bytes. Wenn der Wert überschritten oder unterschritten wird, wird er von den möglicherweise implementierten Bibliotheken vervollständigt oder gekürzt. Da die Blocklänge jedoch 16 Byte beträgt, kann im Allgemeinen davon ausgegangen werden, dass die erforderliche IV 16 Byte beträgt.

Da Sie nun ein gewisses Verständnis von AES haben, beginnen wir mit dem Codieren.

<?phpclass cryptaes{protected $cipher = MCRYPT_RIJNDAEL_128;protected $mode = MCRYPT_MODE_ECB;protected $pad_method = &#39;&#39;;protected $secret_key = &#39;&#39;;protected $iv = &#39;&#39;; public function set_cipher($cipher)
    {$this->cipher = $cipher;
    } public function set_mode($mode)
    {$this->mode = $mode;
    } public function set_iv($iv)
    {$this->iv = $iv;
    } public function set_key($key)
    {$this->secret_key = $key;
    } public function require_pkcs5()
    {$this->pad_method = 'pkcs5';
    } protected function pad_or_unpad($str, $ext)
    {if ( is_null($this->pad_method) )
        {return $str;
        }else{$func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';if ( is_callable($func_name) )
            {$size = mcrypt_get_block_size($this->cipher, $this->mode);return call_user_func($func_name, $str, $size);
            }
        }return $str;
    } protected function pad($str)
    {return $this->pad_or_unpad($str, '');
    } protected function unpad($str)
    {return $this->pad_or_unpad($str, 'un');
    }     //加密类public function encrypt($str)
    {print_r($str);$str = $this->pad($str);$td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) )
        {$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        }else{$iv = $this->iv;
        }
 
        mcrypt_generic_init($td, $this->secret_key, $iv);$cyper_text = mcrypt_generic($td, $str);$rt=base64_encode($cyper_text);//$rt = bin2hex($cyper_text);mcrypt_generic_deinit($td);
        mcrypt_module_close($td); return $rt;
    }     //解密类public function decrypt($str){$td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) )
        {$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        }else{$iv = $this->iv;
        }
 
        mcrypt_generic_init($td, $this->secret_key, $iv);//$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));$decrypted_text = mdecrypt_generic($td, base64_decode($str));$rt = $decrypted_text;
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td); return $this->unpad($rt);
    } public static function hex2bin($hexdata) {$bindata = '';$length = strlen($hexdata);for ($i=0; $i < $length; $i += 2)
        {$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
        }return $bindata;
    } public static function pkcs5_pad($text, $blocksize)
    {$pad = $blocksize - (strlen($text) % $blocksize);return $text . str_repeat(chr($pad), $pad);
    } public static function pkcs5_unpad($text)
    {$pad = ord($text{strlen($text) - 1});if ($pad > strlen($text)) return false;if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;return substr($text, 0, -1 * $pad);
    }
}?>

Die Verpackungsklasse für die AES-Verschlüsselung und -Entschlüsselung ist gekapselt. Verschlüsseln Sie sie bei Bedarf:

require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php'); //ecshop引入文件方式$aes_obj     = new cryptaes();$iv         = '12345678baiducom';$privateKey = '12345678baiducom';$data['a'] =  ‘周二’;$data['b'] =  ‘周三’;$data['c'] =  ‘周四’;$da = json_encode($data);$aes_obj->set_key($privateKey);$aes_obj->require_pkcs5();$aes_obj->set_iv($iv);$il = $aes_obj->encrypt($da);//写入cookiesetcookie('il', $il,time()+360000); //加密结果$il

Ich möchte sie weitergeben Hier ist ein Array. Es ist zu beachten, dass AES nur Zeichenfolgen verschlüsseln kann. Muss in einen String konvertiert werden.

         = ['il'(ROOT_PATH . 'includes/lib_smt_cryptaes.php'     =      = '12345678baiducom';         = '12345678baiducom'->set_key(->->set_iv( = ->decrypt( = json_decode(,);    
       print_r($j_token);//解密结果

Damit ist die Verschlüsselung und Übertragung von AES abgeschlossen.

Wir heißen alle herzlich willkommen, Fragen zu stellen, zu kommunizieren und gemeinsam zu wachsen.

Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial zur AES-Verschlüsselung (Kapselung) von Ecshop. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn