(PHP 4 >= 4.0.2, PHP 5)
mcrypt_encrypt — 使用給定參數加密明文
說明
string mcrypt_encrypt ( string$cipher
, string $key
, string $data
, string $mode
[, string $iv
] )
加密數據并返回密文。
參數
cipher
MCRYPT_ciphername
常量中的一個,或者是字符串值的算法名稱。
key
加密密鑰。 如果其長度小于所需的長度,將在其后使用 '' 補齊。 建議不要使用 ASCII 字符作為密鑰。
建議使用 mhash 函數 從一個字符串中創(chuàng)建密鑰。
data
使用給定的 cipher
和 mode
加密的數據。
如果數據長度不是 n*分組大小,則在其后使用 '' 補齊。
返回的密文長度可能比 data
更大。
mode
MCRYPT_MODE_modename
常量中的一個,或以下字符串中的一個:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。
iv
在 CBC, CFB, OFB 模式中用于初始化過程,在 STREAM 模式中用于某些算法。如果未提供 IV 并且在某算法中需要,本函數發(fā)出一條警告并使用一個全部字節(jié)設為 "" 的 IV。
返回值
以字符串方式返回密文。
范例
Example #1 mcrypt_encrypt() 例程
<?php
# --- 加密 ---
# 密鑰應該是隨機的二進制數據,
# 開始使用 scrypt, bcrypt 或 PBKDF2 將一個字符串轉換成一個密鑰
# 密鑰是 16 進制字符串格式
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# 顯示 AES-128, 192, 256 對應的密鑰長度:
#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)建隨機的初始向量
$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 結尾的
# (因為默認是使用 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.
更高級的 API, 參見 mcrypt_module_open()。