(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)
mcrypt_encrypt — 使用給定參數(shù)加密明文
本函數(shù)已自 PHP 7.1.0 起廢棄。強(qiáng)烈建議不要使用本函數(shù)。
$cipher
,$key
,$data
,$mode
,$iv
= ?加密數(shù)據(jù)并返回密文。
cipher
MCRYPT_ciphername
常量中的一個(gè),或者是字符串值的算法名稱。
key
加密密鑰。
如果密鑰長度不是該算法所能夠支持的有效長度,則函數(shù)將會發(fā)出警告并返回 false
data
使用給定的 cipher
和 mode
加密的數(shù)據(jù)。
如果數(shù)據(jù)長度不是 n*分組大小,則在其后使用 '\0
' 補(bǔ)齊。
返回的密文長度可能比 data
更大。
mode
MCRYPT_MODE_modename
常量中的一個(gè),或以下字符串中的一個(gè):"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
.
以字符串方式返回密文, 或者在失敗時(shí)返回 false
。
版本 | 說明 |
---|---|
5.6.0 |
不再接受無效長度的 key and iv 參數(shù)。
如果參數(shù)長度無效,則 mcrypt_decrypt() 函數(shù)會產(chǎn)生警告并且返回 false 。
之前版本中,對于長度不足的密鑰和初始向量會在其后補(bǔ)齊 '\0 '
使其達(dá)到有效長度。
|
示例 #1 mcrypt_encrypt() 例程
<?php
# --- 加密 ---
# 密鑰應(yīng)該是隨機(jī)的二進(jìn)制數(shù)據(jù),
# 開始使用 scrypt, bcrypt 或 PBKDF2 將一個(gè)字符串轉(zhuǎn)換成一個(gè)密鑰
# 密鑰是 16 進(jìn)制字符串格式
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# 顯示 AES-128, 192, 256 對應(yīng)的密鑰長度:
#16,24,32 字節(jié)。
$key_size = strlen($key);
echo "Key size: " . $key_size . "\n";
$plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";
# 為 CBC 模式創(chuàng)建隨機(jī)的初始向量
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
# 創(chuàng)建和 AES 兼容的密文(Rijndael 分組大小 = 128)
# 僅適用于編碼后的輸入不是以 00h 結(jié)尾的
# (因?yàn)槟J(rèn)是使用 0 來補(bǔ)齊數(shù)據(jù))
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);
# 將初始向量附加在密文之后,以供解密時(shí)使用
$ciphertext = $iv . $ciphertext;
# 對密文進(jìn)行 base64 編碼
$ciphertext_base64 = base64_encode($ciphertext);
echo $ciphertext_base64 . "\n";
# === 警告 ===
# 密文并未進(jìn)行完整性和可信度保護(hù),
# 所以可能遭受 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.