Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die grundlegende Verwendung der PHP-Verschlüsselungserweiterung mcrypt

Detaillierte Einführung in die grundlegende Verwendung der PHP-Verschlüsselungserweiterung mcrypt

黄舟
黄舟Original
2017-03-15 17:14:131705Durchsuche

Mcrypt unterstützt die folgenden vier Gruppen-Verschlüsselungsmodi: CBC, OFB, CFB und EZB. Bei Verknüpfung mit libmcrypt-2.4.x oder höher unterstützt

auch den nOFB-Gruppierungsmodus und den Streaming-Modus. Im Folgenden sind die unterstützten Verschlüsselungsmodi und ihre entsprechenden vordefinierten Konstanten aufgeführt.

1. MCRYPT_MODE_ECB (elektronisches Codebuch) eignet sich beispielsweise für die Verschlüsselung anderer Schlüssel. Da die zu verschlüsselnden Daten

kurz und zufällig sind, spielen die Nachteile dieses Modus tatsächlich eine positive Rolle.

2. MCRYPT_MODE_CBC (Cipher Block Chaining) eignet sich besonders zum Verschlüsseln von Dateien. Im Vergleich zur ECB ist die Sicherheit deutlich verbessert.

3. MCRYPT_MODE_CFB (Cipher Feedback) verschlüsselt jedes einzelne Byte und eignet sich daher sehr gut für die Verschlüsselung von Byteströmen.

4. MCRYPT_MODE_OFB (Ausgaberückmeldung, in 8 Bit) ähnelt CFB. Es kann in Anwendungen verwendet werden, die die Ausbreitung kryptografischer Fehler nicht tolerieren. Da

nach 8 Bit verschlüsselt ist, ist der Sicherheitsfaktor gering und wird nicht empfohlen.

5. MCRYPT_MODE_NOFB (Ausgaberückmeldung, in nbit) ähnelt OFB, ist jedoch sicherer, da es gemäß dem angegebenen Algorithmus gruppiert werden kann

Größe zum Verschlüsseln der Daten.

6. MCRYPT_MODE_STREAM ist ein erweiterter Modus, der Stream-Verschlüsselungsalgorithmen wie „WAKE“ oder „RC4“ umfasst.


<?php
// 获取支持的加密算法
$algos = mcrypt_list_algorithms();
print_r($algos);

// 获取所支持的模式
$modes = mcrypt_list_modes();
print_r($modes);


Veraltet seit PHP5.5.0. Mehrere Methoden sind nicht mehr zur Verwendung empfohlen:

mcrypt_cfc()

mcrypt_cfb()

mcrypt_ecb( )

mcrypt_ofb();


Beispiel 1:

<?php
/**
 * 加密
 * @param $plainText 明文数据
 * @param $key 加密key
 */
function encrypt($plainText, $key) {
	$algo = MCRYPT_RIJNDAEL_256; //加密算法
	$ecb = MCRYPT_MODE_ECB; //加密模式
	$keysize = mcrypt_get_key_size($algo, $ecb);
	$key = substr($key, 0, $keysize); //确保key的长度有效
	$ivSize = mcrypt_get_iv_size($algo, $ecb);
	// 参数 2 可选值有:MCRYPT_RAND(系统随机数生成器), MCRYPT_DEV_RANDOM(从 /dev/random 文件读取数据)
	// 和 MCRYPT_DEV_URANDOM(从 /dev/urandom 文件读取数据)。在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。 
	// 请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值为 MCRYPT_DEV_RANDOM。
	$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); //从随机源创建初始向量
	$encryptText = mcrypt_encrypt($algo, $key, $plainText, $ecb, $iv);
	return trim(base64_encode($encryptText));
}

/**
 * 解密
 * @param encryptedText 密文数据
 * @param $key 解密key
 */
function decrypt($encryptedText, $key) {
	$algo = MCRYPT_RIJNDAEL_256;
	$ecb = MCRYPT_MODE_ECB;
	$keysize = mcrypt_get_key_size($algo, $ecb);
	$key = substr($key, 0, $keysize); //确保key的长度有效
	$cryptText = base64_decode($encryptedText);
	$ivSize = mcrypt_get_iv_size($algo, $ecb);
	$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
	$decryptText = mcrypt_decrypt($algo, $key, $cryptText, $ecb, $iv);
	return trim($decryptText);
}

Beispiel 2:

<?php
/**
 * 数据加密
 * @param $plainText 明文数据
 * @param $key 加密key
 */
function encrypt($plainText, $key) {
	$td = mcrypt_module_open(MCRYPT_3DES, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;); // MCRYPT_3DES = tripledes
	$size = mcrypt_enc_get_iv_size($td); // 返回打开的算法的初始向量大小
	$iv = mcrypt_create_iv($size, MCRYPT_RAND); // 从随机源创建初始向量
	$key = substr($key, 0 ,mcrypt_enc_get_key_size($td)); // 打开模式所能支持的最长密钥长度
	// 初始化加密所需的缓冲区
	// 如果发生错误将会返回负数: -3表示密钥长度有误, -4表示内存分配失败, 其他值表示未知错误, 同时会显示对应的警告信息
	$retInt = mcrypt_generic_init($td, $key, $iv);
	$encrypt_data = mcrypt_generic($td, $plainText); //加密
	mcrypt_generic_deinit($td); // 对加密模块进行清理工作
	mcrypt_module_close($td); // 关闭加密模块
	return base64_encode($encrypt_data);
}

/**
 * 数据解密
 * @param $encryptData 密文数据
 * @param $key 解密key
 */
function decrypt($encryptData, $key) {
	$encryptData = base64_decode($encryptData);
	$td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //从随机源创建初始向量
	$key = substr($key, 0, mcrypt_enc_get_key_size($td));
	$retInt = mcrypt_generic_init($td, $key, $iv);
	// 请注意,由于存在数据补齐的情况,返回字符串的长度可能和明文的长度不相等
	$plainText = mdecrypt_generic($td, $encryptData); // 解密
	mcrypt_generic_deinit($td); // 对加密模块进行清理工作
	mcrypt_module_close($td); // 关闭加密模块
	return $plainText;
}

// 解决数据补齐,造成返回字符串长度和明文长度不一致的问题
$origin_plain = &#39;&#39;; //原始的明文
$plainText = &#39;&#39;; //解密后得到的明文
if (strncmp($origin_plain, $plainText, strlen($origin_plain)) == 0) {
	echo &#39;ok&#39;;
} else {
	echo &#39;error&#39;;
}

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die grundlegende Verwendung der PHP-Verschlüsselungserweiterung mcrypt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn