AES128 / AES256 加密解密

小知识点

注意:若AES加密时,iv输入为空,服务端会填充一个伪随机字节串。输出结果中的iv值需要通过hex2bin函数进行转换拿到真实的iv值。

这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 。

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhine doll"。)

Example

PHP
<?php
// $key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
$key = 'secret';
$tag = null;
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    // Generate a pseudo-random string of bytes
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
输出的结果:message to be encrypted
<?php
$plaintext = "message to be encrypted";
$cipher = "aes-256-cbc";
$key = 'secret';
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = '1111112222220000';
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv);
    echo $ciphertext."\n";
}
输出的结果:eTIQTDLVTkYp1FQ6fh6yn3fMOnHKoqWQA+BOi/QX4FM=