PHP 日本研討會 2024

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 起已過時,並自 PHP 7.2.0 起已移除。強烈建議不要依賴此函式。

描述

mcrypt_encrypt(
    字串 $cipher,
    字串 $key,
    字串 $data,
    字串 $mode,
    字串 $iv = ?
): 字串|false

加密資料並傳回。

參數

cipher

其中一個 MCRYPT_ciphername 常數,或演算法的名稱作為字串。

key

將用來加密資料的金鑰。如果提供的金鑰大小不被密碼演算法支援,則此函式會發出警告並傳回 false

data

將使用給定的 ciphermode 加密的資料。如果資料的大小不是 n * 區塊大小,則資料將以 '\0' 填補。

傳回的密文可以大於 data 給定資料的大小。

mode

其中一個 MCRYPT_MODE_modename 常數,或以下字串之一:「ecb」、「cbc」、「cfb」、「ofb」、「nofb」或「stream」。

iv

用於 CBC、CFB、OFB 模式的初始化,以及 STREAM 模式中的某些演算法。如果鏈結模式不支援提供的 IV 大小,或未提供 IV,但鏈結模式需要一個 IV,則此函式會發出警告並傳回 false

傳回值

以字串形式傳回加密的資料,或在失敗時傳回 false

範例

範例 1 mcrypt_encrypt() 範例

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

# 金鑰應該是隨機的二進位資料,使用 scrypt、bcrypt 或 PBKDF2 來
# 將字串轉換為金鑰
# 金鑰使用十六進位指定
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

# 顯示金鑰大小,AES-128、192 和 256 分別使用 16、24 或 32 位元組的金鑰
$key_size = strlen($key);
echo
"金鑰大小: " . $key_size . "\n";

$plaintext = "這個字串已使用 AES-256 / CBC / ZeroBytePadding 加密。";

# 建立隨機 IV 以用於 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 結尾的編碼輸入
# (因為預設的零填補)
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);

# 在 IV 前面加上,以便可用於解密
$ciphertext = $iv . $ciphertext;

# 編碼產生的密文,使其可用字串表示
$ciphertext_base64 = base64_encode($ciphertext);

echo
$ciphertext_base64 . "\n";

# === 警告 ===

# 產生的密文沒有新增完整性或驗證
# 並且不受保護,無法防禦填補 oracle 攻擊。

# --- 解密 ---

$ciphertext_dec = base64_decode($ciphertext_base64);

# 檢索 IV,iv_size 應該使用 mcrypt_get_iv_size() 建立
$iv_dec = substr($ciphertext_dec, 0, $iv_size);

# 檢索密文(除了前面的 $iv_size 之外的所有內容)
$ciphertext_dec = substr($ciphertext_dec, $iv_size);

# 可能會從純文字結尾移除 00h 值字元
$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.

參見

新增筆記

使用者貢獻筆記 14 筆筆記

62
scott at paragonie dot com
9 年前
如果您在 2015 年撰寫程式碼來加密/解密資料,您應該使用 openssl_encrypt() 和 openssl_decrypt()。 底層函式庫 (libmcrypt) 自 2007 年起已被放棄,並且效能遠遜於 OpenSSL(OpenSSL 在現代處理器上利用 AES-NI,且為快取時序安全)。

此外,`MCRYPT_RIJNDAEL_256` 並非 AES-256,它是 Rijndael 分組密碼的另一種變體。如果您想在 mcrypt 中使用 AES-256,則必須使用 `MCRYPT_RIJNDAEL_128` 並搭配 32 位元組的金鑰。OpenSSL 更清楚地表明您正在使用的模式(例如,'aes-128-cbc' 與 'aes-256-ctr')。

OpenSSL 在 CBC 模式下也使用 PKCS7 填充,而不是 mcrypt 的 NULL 位元組填充。因此,相較於 OpenSSL,mcrypt 更容易使您的程式碼遭受填充預言攻擊。

最後,如果您沒有對您的密文進行身份驗證(先加密再 MAC),那麼您就做錯了。

延伸閱讀

https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly

https://paragonie.com/blog/2015/05/if-you-re-typing-word-mcrypt-into-your-code-you-re-doing-it-wrong
23
jesse at pctest dot com
19 年前
解決與 .NET 的 TripleDESCryptoServiceProvider 的 3DES 不相容性問題

mcrypt 的 3DES 只接受 192 位元的金鑰,但 Microsoft 的 .NET 和許多其他工具都接受 128 和 192 位元的金鑰。
如果您的金鑰太短,mcrypt 會「好心地」在末尾填充空字元,但 .NET 拒絕使用最後三分之一都是空字元的金鑰(這是不良金鑰)。這會使您無法在 .NET 中模擬 mcrypt 的「短金鑰」行為。

如何調和這個問題?需要一些 DES 理論
3DES 會執行三次 DES 演算法,使用您的 192 位元金鑰的每三分之一作為 64 位元的 DES 金鑰

加密 金鑰1 -> 解密 金鑰2 -> 加密 金鑰3

而且 .NET 和 PHP 的 mcrypt 都以相同的方式執行此操作。
問題出現在 .NET 上的短金鑰模式,因為 128 位元只有兩個 64 位元的 DES 金鑰
他們使用的演算法是

加密 金鑰1 -> 解密 金鑰2 -> 加密 金鑰1

mcrypt 原生沒有這種操作模式。
但在您開始自己執行三次 DES 之前,這裡有一個快速修復方法
<?php
$my_key
= "12345678abcdefgh"; // 一個 128 位元 (16 位元組) 金鑰
$my_key .= substr($my_key,0,8); // 將前 8 個位元組附加到末尾
$secret = mcrypt_encrypt(MCRYPT_3DES, $my_key, $data, MCRYPT_MODE_CBC, $iv); //CBC 是 .NET 中的預設模式
?>

然後,就像變魔術一樣,它就起作用了。

還有一個注意事項:資料填充
mcrypt 總是使用空字元填充資料
但 .NET 有兩種填充模式:「Zeros」和「PKCS7」
「Zeros」與 mcrypt 方案相同,但「PKCS7」是預設值。
不過,「PKCS7」並沒有複雜太多
它不是填充空字元,而是附加填充位元組的總數(這表示,對於 3DES,它可以是 0x01 到 0x07 的值)
如果您的明文是「ABC」,它將被填充為
0x41 0x42 0x43 0x05 0x05 0x05 0x05 0x05

您可以在 PHP 中從解密的字串中刪除這些字元,方法是計算最後一個字元出現的次數,如果它與它的序數值相符,則將字串截斷這麼多個字元
<?php
$block
= mcrypt_get_block_size('tripledes', 'cbc');
$packing = ord($text{strlen($text) - 1});
if(
$packing and ($packing < $block)){
for(
$P = strlen($text) - 1; $P >= strlen($text) - $packing; $P--){
if(
ord($text{$P}) != $packing){
$packing = 0;
}
}
}
$text = substr($text,0,strlen($text) - $packing);
?>

而且要填充一個您打算用 .NET 解密的字串,只需新增填充位元組數的 chr() 值
<?php
$block
= mcrypt_get_block_size('tripledes', 'cbc');
$len = strlen($dat);
$padding = $block - ($len % $block);
$dat .= str_repeat(chr($padding),$padding);
?>

這就是全部了。
了解了這一點,您就可以在 PHP 中準確地加密、解密和複製任何 .NET 3DES 行為。
4
your dot brother dot t at hotmail dot com
9 年前
加密沒有真實性檢查。它可以透過三種方法實現,說明於 http://en.wikipedia.org/wiki/Authenticated_encryption#Approaches_to_Authenticated_Encryption
先加密後 MAC (EtM)、加密並 MAC (E&M)、先 MAC 後加密 (MtE)。

以下是 MtE 的建議

<?php
public static function getMacAlgoBlockSize($algorithm = 'sha1')
{
switch(
$algorithm)
{
case
'sha1':
{
return
160;
}
default:
{
return
false;
break;
}
}
}

public static function
decrypt($message, $key, $mac_algorithm = 'sha1',
$enc_algorithm = MCRYPT_RIJNDAEL_256, $enc_mode = MCRYPT_MODE_CBC)
{
$message= base64_decode($message);
$iv_size = mcrypt_get_iv_size($enc_algorithm, $enc_mode);

$iv_dec = substr($message, 0, $iv_size);
$message= substr($message, $iv_size);

$message= mcrypt_decrypt($enc_algorithm, $key, $message, $enc_mode, $iv_dec);

$mac_block_size = ceil(static::getMacAlgoBlockSize($mac_algorithm)/8);
$mac_dec = substr($message, 0, $mac_block_size);
$message= substr($message, $mac_block_size);

$mac = hash_hmac($mac_algorithm, $message, $key, true);

if(
$mac_dec == $mac)
{
return
$password;
}
else
{
return
false;
}
}

public static function
encrypt($message, $key, $mac_algorithm = 'sha1',
$enc_algorithm = MCRYPT_RIJNDAEL_256, $enc_mode = MCRYPT_MODE_CBC)
{

$mac = hash_hmac($mac_algorithm, $message, $key, true);
$mac = substr($mac, 0, ceil(static::getMacAlgoBlockSize($mac_algorithm)/8));
$message= $mac . $message;

$iv_size = mcrypt_get_iv_size($enc_algorithm, $enc_mode);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$ciphertext = mcrypt_encrypt($enc_algorithm, $key,
$message, $enc_mode, $iv);

return
base64_encode($iv . $ciphertext);
}
?>
5
匿名
13 年前
在其他筆記中,對於加密和 IV(初始化向量),特別是對於 CBC 模式,有一些誤解。

最重要的一點:加密**絕對無法**提供任何資料完整性或驗證的證明。如果您需要確保資料是秘密的且未被篡改,您需要先加密,然後使用帶金鑰的 HMAC。

對於 CBC 模式,IV 不需要是秘密的。它可以與明文一起發送。它需要是**獨一無二**且**隨機**的。這樣每條訊息都使用不同的 IV 進行加密。

產生 IV 的最佳方法是使用 mcrypt_create_iv()。

金鑰必須是二進制,而不是 ASCII。要從密碼建立金鑰

<?php
$password
= "MyPassword!1!";
$aes256Key = hash("SHA256", $password, true); // 我們想要一個 32 位元組的二進制 blob
?>
4
Scott.a.Herbert at googlemail.com
12 年前
始終最好使用標準的加密密碼,而不是「自己設計」,首先,標準密碼已經過世界級密碼分析師的測試,而除非您是世界級密碼分析師(如果您是,您為什麼還要考慮自己設計?!?)您甚至沒有測試它所需的技能(例如,如果您只是使用金鑰 XOR 每個字元,它可能看起來很安全(文字會不同),但如果您計算字元重複的次數,您會看到無論字母「E」加密成什麼,它的出現頻率都比加密的「Z」高(假設是英文明文))

其次,您可能會認為您的密碼的隱藏特性使其更安全,但事實是,您的密碼很可能**僅僅**因為它是秘密的才是安全的,如果有人能夠闖入您的網站並竊取您的程式碼(但不是您的金鑰),他們可能就能破解您加密的資料,如果有人闖入並發現您使用的是 Blowfish(例如),這對他們沒有幫助。
2
MadMass
11 年前
請注意,mcrypt_encrypt 和 mcrypt_decrypt 的 IV 必須相同,否則解密後資料會損壞。
2
匿名
13 年前
我注意到有些人使用 a-z、A-Z 和 0-9 作為金鑰,並聲稱「16 個字元是 128 位元的金鑰」。這是不正確的。僅使用這些字元,您每個字元最多只能獲得 6 位元的熵。

log2(26 + 26 + 10) = 5.954196310386876

因此,您實際上在 16 個字元中僅獲得 95 位元的熵,這是在您使用完整範圍的情況下獲得的金鑰空間的 0.0000000117%。

為了從僅使用 a-z、A-Z 和 0-9 的金鑰中獲得完整的熵,您應該將金鑰長度乘以 1.3333,以彌補每個位元組損失的 2 位元熵。
1
匿名
17 年前
我應該提到,ECB 模式會忽略 IV,因此顯示同時使用 MCRYPT_MODE_ECB 和 IV 的範例具有誤導性(手冊中的範例顯示了相同的內容)。此外,重要的是要知道 ECB 對於隨機資料很有用,但結構化資料應使用更強的模式,例如 MCRYPT_MODE_CBC

此外,rtrim($decryptedtext, "\0") 比我懶惰的 trim() 更好,可以移除 NULL 填充...
-3
Robin Leffmann
14 年前
與 mcrypt_encrypt() 手冊頁以及關於 CBC 與 CFB 模式的資訊所暗示的相反,mcrypt_encrypt() 對於加密二進制資料也同樣有效。

一個簡單的範例驗證,一旦切割到其原始長度,解密後的輸出在二進制上是相同的

<?php

// 448 位元金鑰 (56 位元組) - mcrypt/php 用於 Blowfish 加密演算法的唯一大小
// (使用較小的金鑰也沒問題,因為 mcrypt 會附加 \0 來達到正確的金鑰大小)
$key = 'SADFo92jzVnzSj39IUYGvi6eL8v6RvJH8Cytuiouh547vCytdyUFl76R';

// Blowfish/CBC 使用 8 位元組 IV
$iv = substr( md5(mt_rand(),true), 0, 8 );

// 對一些隨機資料執行 50 次加密/解密操作,並使用 md5() 驗證完整性
for( $i = 0; $i < 50; $i++ )
{
// 建立一個隨機長度的隨機二進位字串
$size = mt_rand( 25000, 500000 );
$c = 0; $data = null;
while(
$c++ * 16 < $size )
$data .= md5( mt_rand(), true );
$data = substr( $data, 0, $size );
$cksum = md5( $data );

// 使用 Blowfish/CBC 加密
$enc = mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv );

echo
$size . ' -> ' . strlen( $enc ) . ' -> ';

// 解密 (使用相同的 IV - CBC 模式的必要條件)
$dec = mcrypt_decrypt( MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_CBC, $iv );

// 使用 substr() 截斷輸出,而不是使用某些 mcrypt 手冊頁中建議的 rtrim() - 這是二進位資料,而不是純文字
echo ( md5(substr($dec, 0, $size)) == $cksum ? 'ok' : 'bad' ) . PHP_EOL;
}

?>
-5
stefan at katic dot me dot rs
10 年前
我嘗試 (並成功) 在 JAVA 中加密和解密,然後傳遞給 php,然後再次執行,當我注意到一些有趣的事情時,資料沒有損壞。所以,我的程式碼如下所示
$data = 'one';
$key = '1234567890123456';

function encrypt($data, $key){
return base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$data,
MCRYPT_MODE_CBC,
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
)
);
}
function decrypt($data, $key){
$decode = base64_decode($data);
return mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$decode,
MCRYPT_MODE_CBC,
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
);


}
$encrypted = encrypt($data, $key);
$decrypted= decrypt($encrypted, $key);

// 一開始,我認為有些地方出錯了,因為我在 $decrypted 和 $data 之間做了 '===' 的比較。它不起作用(但後來又開始工作了,我不知道為什麼...)。所以,我將它們都輸出了
var_dump($data);
var_dump($decrypted);
// 結果
string(16) "one"
string(16) "one"
// 顯然,兩者的長度都是 3,而不是 16。只是想讓您知道可能會發生什麼,我真的不知道這是不是一個錯誤...
謝謝,
S.
-2
匿名
6 年前
<?php
# Vernam Cipher (One-time pad)
$k1 = '1.key';
$k2 = '2.key';
$d = 'The quick brown fox jumped over the lazy dog';
VernamCipher::createTestKeyFile($k1, 1024);
copy($k1, $k2);
$c1 = new VernamCipher($k1);
$eD = $c1->encryptWithHMAC($d);
echo
'Encrypted: ', bin2hex($eD);
$c2 = new VernamCipher($k2);
echo
PHP_EOL, 'Decrypted: ', $c2->decryptWithHMAC($eD);

class
VernamCipher
{
const
DEFAULT_HMAC_ALGO = 'sha3-256';
const
DEFAULT_HMAC_KEY_LENGTH = 16;
const
DEFAULT_HMAC_HASH_LENGTH = 32;
private
$keyFilePath;
private
$keyFileHandler;
private
$deferredFtruncate = false;
private
$deferredFtruncatePos;
private
$hmacAlgo = self::DEFAULT_HMAC_ALGO;
private
$hmacKeyLength = self::DEFAULT_HMAC_KEY_LENGTH;
private
$hmacHashLength = self::DEFAULT_HMAC_HASH_LENGTH;

function
__construct(string $keyFilePath, string $hmacAlgo = self::DEFAULT_HMAC_ALGO, int $hmacKeyLength = self::DEFAULT_HMAC_KEY_LENGTH)
{
$this->keyFilePath = $keyFilePath;
$this->openKeyFile();

if(
$hmacAlgo !== self::DEFAULT_HMAC_ALGO) {
if(
in_array($hmacAlgo, hash_algos())) {
$this->hmacAlgo = $hmacAlgo;
$this->hmacHashLength = strlen(hash($this->hmacAlgo, '', true));
}
else {
$this->hmacAlgo = self::DEFAULT_HMAC_ALGO;
$this->hmacHashLength = self::DEFAULT_HMAC_HASH_LENGTH;
}
}

if(
$hmacKeyLength !== self::DEFAULT_HMAC_KEY_LENGTH) {
$this->hmacKeyLength = $hmacKeyLength;
}
}
public function
encryptWithHMAC(string $data)
{
$hmacKey = $this->getBytes($this->hmacKeyLength);
$encData = $this->encrypt($data);
$dataHmac = $this->hashHmac($encData, $hmacKey);

return
$dataHmac.$encData;
}
public function
decryptWithHMAC(string $data)
{
$dataLength = strlen($data);

if(
$dataLength < $this->hmacHashLength)
throw new
Exception('data length '.$dataLength.' < hmac length '. $this->hmacHashLength);

$dataHmacRemote = substr($data, 0, $this->hmacHashLength);
$dataOnly = substr($data, $this->hmacHashLength);

$hmacKey = $this->getBytes($this->hmacKeyLength, false);
$dataHmacLocal = $this->hashHmac($dataOnly, $hmacKey);

if(
hash_equals($dataHmacLocal, $dataHmacRemote) === false)
throw new
Exception('Hashes not equals, remote: '.bin2hex($dataHmacRemote).' local:'. bin2hex($dataHmacLocal));

$this->deferredFtruncate();

return
$this->encrypt($dataOnly);
}
public function
encrypt(string $data) : string
{
$dataLength = strlen($data);
$bytes = $this->getBytes($dataLength);
for(
$i=0;$i<$dataLength;$i++)
$data{$i} = $data{$i} ^ $bytes{$i};

return
$data;
}
public function
decrypt(string $data) : string
{
return
$this->encrypt($data);
}
private function
hashHmac($data, $key)
{
return
hash_hmac($this->hmacAlgo, $data, $key, true);
}
# Don't use in production. You must use true random number generator.
public static function createTestKeyFile(string $filePath, int $size)
{
file_put_contents($filePath, random_bytes($size));
}
private function
deferredFtruncate()
{
if(!
$this->deferredFtruncate)
return;

ftruncate($this->keyFileHandler, $this->deferredFtruncatePos);
$this->deferredFtruncate = false;
}
public function
getBytes(int $length, $truncateNow = true) : string
{
fseek($this->keyFileHandler, 0, SEEK_END);
$currentPos = ftell($this->keyFileHandler);

if(
$currentPos < $length)
throw new
Exception('Not enough key materials, key size: '. $currentPos. ' needed: '.$length);

fseek($this->keyFileHandler, -$length, SEEK_END);
$bytes = fread($this->keyFileHandler, $length);

if(
$truncateNow)
ftruncate($this->keyFileHandler, $currentPos - $length);
else {
$this->deferredFtruncate = true;
$this->deferredFtruncatePos = $currentPos - $length;
}

return
$bytes;
}
private function
openKeyFile()
{
if(
$this->keyFileHandler)
return;

if((
$this->keyFileHandler = fopen($this->keyFilePath, 'rb+')) === false)
throw new
Exception('Cant open key file: '.$this->keyFilePath);

if(!
flock($this->keyFileHandler, LOCK_EX | LOCK_NB))
throw new
Exception('Cant lock key file: '.$this->keyFilePath);
}
}
?>
-5
stonecypher at gmail dot com
18 年前
這裡大多數使用者編寫的加密範例都嚴重損壞,並且有一些案例是手冊說的事情完全不正確,例如「以純文字傳輸初始化向量是安全的」(這是不正確的:請參閱 Ciphers By Ritter,http://www.ciphersbyritter.com/GLOSSARY.HTM#IV,以瞭解詳細資訊。)

mcrypt 本身是完全安全的,但正確且因此安全的使用方式並不顯而易見。正確使用加密函式庫非常重要;一個簡單的使用錯誤,即使它產生可以在另一端解壓縮的結果,也可能使一個強大的演算法完全失效。

初始化向量必須使用可恢復的雜訊來源進行排列(任意 md5 雜湊是可以接受的,因為它只是一個假的 OTP,並且其來源內容完全不重要)。

密碼應該使用加鹽的單向雜湊重新製作(即使 md5 已經損壞,它也是可以接受的,因為從破解的 md5 雜湊中唯一可以恢復的是產生密碼的原始資料,這是沒有用的。)

使用健全的區塊模式非常重要(OFB 對幾乎所有演算法都是不安全的;永遠不要使用它。在所有情況下都偏好使用 CBC,除非您需要處理退化的訊號並且無法重新傳輸。)

一個正確的使用範例實際上很長,並且需要很多解釋,所以我開發了一個安全的包裝函式庫,它不會限制使用,並且對自身進行了大量的註解。它適用於使用或學習。請參閱我的部落格,以瞭解有關 Stone PHP SafeCrypt 的詳細資訊

http://blog.sc.tri-bit.com/archives/101
-5
leilond at hotmail dot com
8 年前
我總是使用這個方法來避免很多錯誤

function encrypt( $string ) {
$algorithm = 'rijndael-128'; // 您可以使用任何可用的演算法
$key = md5( "mypassword", true); // 二進位原始 16 位元組維度。
$iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );
$iv = mcrypt_create_iv( $iv_length, MCRYPT_RAND );
$encrypted = mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv );
$result = base64_encode( $iv . $encrypted );
return $result;
}
function decrypt( $string ) {
$algorithm = 'rijndael-128';
$key = md5( "mypassword", true );
$iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );
$string = base64_decode( $string );
$iv = substr( $string, 0, $iv_length );
$encrypted = substr( $string, $iv_length );
$result = mcrypt_decrypt( $algoritmo, $key, $encrypted, MCRYPT_MODE_CBC, $iv );
return $result;
}
-5
gm dot outside+php at gmail dot com
10 年前
請注意,以下的文件部分已不再正確(在提交後:http://git.php.net/?p=php-src.git;a=commit;h=a861a3a93d89a50ce58e1ab1abef1eb501f97483

> 金鑰
> 將用來加密資料的金鑰。如果它小於所需金鑰大小,則會用 '\0' 填充。最好不要使用 ASCII 字串作為金鑰。

該提交將行為更改為嚴格模式,如果金鑰大小小於所需大小,則會發出警告,如下所示

Warning: mcrypt_encrypt(): 此演算法不支援大小為 10 的金鑰。僅支援大小為 16 的金鑰,位於 script.php 第 5 行

並且 mcrypt_encode() 將返回失敗。
To Top