(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mcrypt_encrypt — 使用给定参数加密明文
$cipher
, string $key
, string $data
, string $mode
[, string $iv
] )加密数据并返回密文。
cipher
MCRYPT_ciphername
常量中的一个,或者是字符串值的算法名称。
key
加密密钥。
如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 FALSE
data
使用给定的 cipher
和 mode
加密的数据。
如果数据长度不是 n*分组大小,则在其后使用 '\0' 补齐。
返回的密文长度可能比 data
更大。
mode
MCRYPT_MODE_modename
常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。
iv
Used for the initialization in CBC, CFB, OFB modes, and in some algorithms in STREAM mode. If the provided IV size is not supported by the chaining mode or no IV was provided, but the chaining mode requires one, the function will emit a warning and return FALSE
.
以字符串方式返回密文, 或者在失败时返回 FALSE
。
版本 | 说明 |
---|---|
5.6.0 |
不再接受无效长度的 key and iv 参数。
如果参数长度无效,则 mcrypt_decrypt() 函数会产生警告并且返回 FALSE 。
之前版本中,对于长度不足的密钥和初始向量会在其后补齐 '\0'
使其达到有效长度。
|
Example #1 mcrypt_encrypt() 例程
<?php
# --- 加密 ---
# 密钥应该是随机的二进制数据,
# 开始使用 scrypt, bcrypt 或 PBKDF2 将一个字符串转换成一个密钥
# 密钥是 16 进制字符串格式
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# 显示 AES-128, 192, 256 对应的密钥长度:
#16,24,32 字节。
$key_size = strlen($key);
echo "Key size: " . $key_size . "\n";
$plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";
# 为 CBC 模式创建随机的初始向量
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
# 创建和 AES 兼容的密文(Rijndael 分组大小 = 128)
# 仅适用于编码后的输入不是以 00h 结尾的
# (因为默认是使用 0 来补齐数据)
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);
# 将初始向量附加在密文之后,以供解密时使用
$ciphertext = $iv . $ciphertext;
# 对密文进行 base64 编码
$ciphertext_base64 = base64_encode($ciphertext);
echo $ciphertext_base64 . "\n";
# === 警告 ===
# 密文并未进行完整性和可信度保护,
# 所以可能遭受 Padding Oracle 攻击。
# --- 解密 ---
$ciphertext_dec = base64_decode($ciphertext_base64);
# 初始向量大小,可以通过 mcrypt_get_iv_size() 来获得
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
# 获取除初始向量外的密文
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
# 可能需要从明文末尾移除 0
$plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
$ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
echo $plaintext_dec . "\n";
?>
以上例程会输出:
Key size: 32 ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU= This string was AES-256 / CBC / ZeroBytePadding encrypted.