使用給定參數加密明文

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 起廢棄。強烈建議不要使用本函式。

說明

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

加密數據並返回密文。

參數

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

更新日誌

版本 說明
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_128MCRYPT_MODE_CBC);
    
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);
    

    
# 建立和 AES 相容的密文(Rijndael 分組大小 = 128)
    # 僅適用於編碼后的輸入不是以 00h 結尾的
    # (因為預設是使用 0 來補齊數據)
    
$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.

參見

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *