>  기사  >  백엔드 개발  >  PHP 암호화 확장 mcrypt의 기본 사용에 대한 자세한 소개

PHP 암호화 확장 mcrypt의 기본 사용에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-15 17:14:131705검색

Mcrypt는 다음 네 가지 그룹 암호화 모드를 지원합니다: CBC, OFB, CFB 그리고 ECB. libmcrypt-2.4.x 이상과 연결하면

nOFB 그룹 모드와 스트리밍 모드를 지원합니다. 다음은 지원되는 암호화 모드와 해당 미리 정의된 상수입니다.

1. MCRYPT_MODE_ECB(전자 코드북)는 임의의 데이터에 적합합니다. 예를 들어 이 모드는 다른 키를 암호화하는 데 사용할 수 있습니다. 암호화할 데이터

는 짧고 무작위적이므로 이 모드의 단점은 실제로 긍정적인 역할을 합니다.

2. MCRYPT_MODE_CBC(암호화 블록 체인)는 특히 파일 암호화에 적합합니다. ECB와 비교하여 보안이 크게 향상되었습니다.

3. MCRYPT_MODE_CFB(암호 피드백)는 개별 바이트를 암호화하므로 바이트 스트림 암호화에 매우 적합합니다.

4. MCRYPT_MODE_OFB(출력 피드백, 8비트)는 CFB와 유사합니다. 암호화 오류의 전파를 허용할 수 없는 애플리케이션에 사용할 수 있습니다.

은 8비트로 암호화되므로 보안성이 낮아 권장하지 않습니다.

5. MCRYPT_MODE_NOFB(출력 피드백, nbit)는 OFB와 유사하지만 지정된 알고리즘에 따라 그룹화할 수 있으므로 더 안전합니다

데이터를 암호화할 크기입니다.

6. MCRYPT_MODE_STREAM은 "WAKE" 또는 "RC4"와 같은 스트림 암호화 알고리즘을 포함하는 확장 모드입니다.


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

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


PHP5.5.0 이후로 버려진 몇 가지 메서드, 더 이상 사용이 권장되지 않습니다:

mcrypt_cfc()

mcrypt_cfb()

mcrypt_ecb()

mcrypt_ofb();


예 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);
}

예 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;;
}

위 내용은 PHP 암호화 확장 mcrypt의 기본 사용에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.