mcrypt_encrypt

(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 起廢棄。強烈建議不要使用本函數(shù)。

說明

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

加密數(shù)據(jù)并返回密文。

參數(shù)

cipher

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

key

加密密鑰。 如果密鑰長度不是該算法所能夠支持的有效長度,則函數(shù)將會發(fā)出警告并返回 false

data

使用給定的 ciphermode 加密的數(shù)據(jù)。 如果數(shù)據(jù)長度不是 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 參數(shù)。 如果參數(shù)長度無效,則 mcrypt_decrypt() 函數(shù)會產(chǎn)生警告并且返回 false。 之前版本中,對于長度不足的密鑰和初始向量會在其后補齊 '\0' 使其達到有效長度。

范例

示例 #1 mcrypt_encrypt() 例程

<?php
    
# --- 加密 ---

    # 密鑰應該是隨機的二進制數(shù)據(jù),
    # 開始使用 scrypt, bcrypt 或 PBKDF2 將一個字符串轉(zhuǎn)換成一個密鑰
    # 密鑰是 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_128MCRYPT_MODE_CBC);
    
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);
    

    
# 創(chuàng)建和 AES 兼容的密文(Rijndael 分組大小 = 128)
    # 僅適用于編碼后的輸入不是以 00h 結(jié)尾的
    # (因為默認是使用 0 來補齊數(shù)據(jù))
    
$ciphertext mcrypt_encrypt(MCRYPT_RIJNDAEL_128$key,
                                 
$plaintextMCRYPT_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_dec0$iv_size);
    
    
# 獲取除初始向量外的密文
    
$ciphertext_dec substr($ciphertext_dec$iv_size);

    
# 可能需要從明文末尾移除 0
    
$plaintext_dec mcrypt_decrypt(MCRYPT_RIJNDAEL_128$key,
                                    
$ciphertext_decMCRYPT_MODE_CBC$iv_dec);
    
    echo  
$plaintext_dec "\n";
?>

以上例程會輸出:

Key size: 32
ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU=
This string was AES-256 / CBC / ZeroBytePadding encrypted.

參見