mcrypt_encrypt

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_encrypt使用给定参数加密明文

警告

本函数已自 PHP 7.1.0 起废弃并将自 PHP 7.2.0 起移除。强烈建议不要使用本函数。

说明

mcrypt_encrypt(
    string $cipher,
    string $key,
    string $data,
    string $mode,
    string $iv = ?
): string|false

加密数据并返回密文。

参数

cipher

MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称。

key

加密密钥。 如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 false

data

使用给定的 ciphermode 加密的数据。 如果数据长度不是 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

示例

示例 #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.

参见

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top