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 起廢棄。強烈建議不要使用本函式。
說明
string
$cipher
,string
$key
,string
$data
,string
$mode
,string
$iv
= ?): string
加密數據並返回密文。
參數
-
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 '
使其達到有效長度。
|
範例
示例 #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.