PHP 암호화 함수 mcrypt_encrypt 와 openssl_encrypt
페이지 정보
본문
PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0 에서 mcrypt_encrypt (암호화) 와 mcrypt_decrypt (복호화) 를 사용합니다
PHP 5 >= 5.3.0, PHP 7, PHP 8 에서 openssl_encrypt (암호화) 와 openssl_decrypt (복호화) 를 사용합니다
1. PHP 5.x
<?php
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS"); // 임의 token값에서 참조
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS"); // 임의 token값에서 참조
if (!function_exists('hex2bin')) {
function hex2bin($hexdata) {
$bindata="";
for ($i=0;$i<strlen($hexdata);$i+=2) {
$bindata.=chr(hexdec(substr($hexdata,$i,2)));
}
return $bindata;
}
}
function toPkcs7 ($value) {
if ( is_null ($value) )
$value = "";
$padSize = 16 - (strlen ($value) % 16);
return $value . str_repeat (chr ($padSize), $padSize);
}
function fromPkcs7 ($value) {
$valueLen = strlen ($value);
if ( $valueLen % 16 > 0 )
$value = "";
$padSize = ord ($value{$valueLen - 1});
if ( ($padSize < 1) or ($padSize > 16) )
$value = "";
// Check padding.
for ($i = 0; $i < $padSize; $i++) {
if ( ord ($value{$valueLen - $i - 1}) != $padSize )
$value = "";
}
return substr ($value, 0, $valueLen - $padSize);
}
if (!function_exists('encrypt')) { // PHP5 mcrypt_encrypt 암호화
function encrypt ($mcrypt_key, $mcrypt_iv, $value) {
if ( is_null ($value) )
$value = "";
$value = toPkcs7 ($value);
$output = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $mcrypt_key, $value, MCRYPT_MODE_CBC, $mcrypt_iv);
return base64_encode ($output);
}
}
if (!function_exists('decrypt')) { // PHP5 mcrypt_decrypt 복호화
function decrypt ($mcrypt_key, $mcrypt_iv, $value) {
if ( is_null ($value) )
$value = "";
$value = base64_decode ($value);
$output = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $mcrypt_key, $value, MCRYPT_MODE_CBC, $mcrypt_iv);
return fromPkcs7 ($output);
}
}
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS");
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS");
$mcrypt_value = "해피정닷컴?ABCDEFG!@#$%^&*12345678";
echo $mcrypt_value ."<br><br>";
// 암호화
$mcrypt_value = encrypt($mcrypt_key, $mcrypt_iv, $mcrypt_value);
echo "암호화 256-bit encrypted : {$data} <br><br>";
// 복호화
$mcrypt_value = decrypt($mcrypt_key, $mcrypt_iv, $mcrypt_value);
echo "복호화 256-bit decrypted : {$data} <br><br>";
?>
2. PHP 7 & PHP 8
mcrypt_encrypt 와 mcrypt_decrypt 함수는 PHP 7.1.0 부터 더 이상 사용 되지 않으며 PHP 7.2.0 부터 제거 되었습니다.
아래와 같이 추가하면 php 7 에서도 함수를 사용할 수 있습니다
php 5.x 와 php 7.x 에서는 value 값의 위치가 달라지므로 적용할때 주의가 필요합니다
테스트 : https://www.happyjung.com/demo/php/mcrypt.php
<?php
if (!function_exists('hex2bin')) {
function hex2bin($hexdata) {
$bindata="";
for ($i=0;$i<strlen($hexdata);$i+=2) {
$bindata.=chr(hexdec(substr($hexdata,$i,2)));
}
return $bindata;
}
}
if (!function_exists('toPkcs7')) {
function toPkcs7 ($value) {
if ( is_null ($value) )
$value = "";
$padSize = 16 - (strlen ($value) % 16);
return $value . str_repeat (chr ($padSize), $padSize);
}
}
if (!function_exists('fromPkcs7')) {
function fromPkcs7 ($value) {
$valueLen = strlen ($value);
if ( $valueLen % 16 > 0 )
$value = "";
$padSize = ord ($value{$valueLen - 1});
if ( ($padSize < 1) or ($padSize > 16) )
$value = "";
// Check padding.
for ($i = 0; $i < $padSize; $i++) {
if ( ord ($value{$valueLen - $i - 1}) != $padSize )
$value = "";
}
return substr($value, 0, $valueLen - $padSize);
}
}
if (!function_exists('encrypt')) { // mcrypt_encrypt 암호화
function encrypt ($key, $value, $IV) {
if ( is_null ($value) )
$value = "";
$value = toPkcs7 ($value);
$output = openssl_encrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
return base64_encode ($output);
}
}
if (!function_exists('decrypt')) { // mcrypt_decrypt 복호화
function decrypt ($key, $value, $IV) {
if ( is_null ($value) )
$value = "";
$value = base64_decode ($value) ;
$output = openssl_decrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
return fromPkcs7 ($output);
}
}
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS"); //
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS"); //
$mcrypt_value = "해피정닷컴?ABCDEFG!@#$%^&*12345678";
echo $mcrypt_value ."<br><br>";
// 암호화
$mcrypt_value = encrypt($mcrypt_key, $mcrypt_value, $mcrypt_iv);
echo("암호화 256-bit encrypted : {$mcrypt_value} <br><br>");
// 복호화
$mcrypt_value = decrypt($mcrypt_key, $mcrypt_value, $mcrypt_iv);
echo("복호화 256-bit decrypted : {$mcrypt_value} <br><br>");
?>
참고자료
https://www.php.net/manual/en/function.mcrypt-decrypt.php
https://note-it.tistory.com/21
https://tempuss.tistory.com/entry/PHP-mcrypt-함수-마이그레이션
https://www.php.net/manual/en/function.openssl-encrypt.php
https://www.php.net/manual/en/function.mcrypt-encrypt.php
PHP 5 >= 5.3.0, PHP 7, PHP 8 에서 openssl_encrypt (암호화) 와 openssl_decrypt (복호화) 를 사용합니다
1. PHP 5.x
<?php
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS"); // 임의 token값에서 참조
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS"); // 임의 token값에서 참조
if (!function_exists('hex2bin')) {
function hex2bin($hexdata) {
$bindata="";
for ($i=0;$i<strlen($hexdata);$i+=2) {
$bindata.=chr(hexdec(substr($hexdata,$i,2)));
}
return $bindata;
}
}
function toPkcs7 ($value) {
if ( is_null ($value) )
$value = "";
$padSize = 16 - (strlen ($value) % 16);
return $value . str_repeat (chr ($padSize), $padSize);
}
function fromPkcs7 ($value) {
$valueLen = strlen ($value);
if ( $valueLen % 16 > 0 )
$value = "";
$padSize = ord ($value{$valueLen - 1});
if ( ($padSize < 1) or ($padSize > 16) )
$value = "";
// Check padding.
for ($i = 0; $i < $padSize; $i++) {
if ( ord ($value{$valueLen - $i - 1}) != $padSize )
$value = "";
}
return substr ($value, 0, $valueLen - $padSize);
}
if (!function_exists('encrypt')) { // PHP5 mcrypt_encrypt 암호화
function encrypt ($mcrypt_key, $mcrypt_iv, $value) {
if ( is_null ($value) )
$value = "";
$value = toPkcs7 ($value);
$output = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $mcrypt_key, $value, MCRYPT_MODE_CBC, $mcrypt_iv);
return base64_encode ($output);
}
}
if (!function_exists('decrypt')) { // PHP5 mcrypt_decrypt 복호화
function decrypt ($mcrypt_key, $mcrypt_iv, $value) {
if ( is_null ($value) )
$value = "";
$value = base64_decode ($value);
$output = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $mcrypt_key, $value, MCRYPT_MODE_CBC, $mcrypt_iv);
return fromPkcs7 ($output);
}
}
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS");
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS");
$mcrypt_value = "해피정닷컴?ABCDEFG!@#$%^&*12345678";
echo $mcrypt_value ."<br><br>";
// 암호화
$mcrypt_value = encrypt($mcrypt_key, $mcrypt_iv, $mcrypt_value);
echo "암호화 256-bit encrypted : {$data} <br><br>";
// 복호화
$mcrypt_value = decrypt($mcrypt_key, $mcrypt_iv, $mcrypt_value);
echo "복호화 256-bit decrypted : {$data} <br><br>";
?>
2. PHP 7 & PHP 8
mcrypt_encrypt 와 mcrypt_decrypt 함수는 PHP 7.1.0 부터 더 이상 사용 되지 않으며 PHP 7.2.0 부터 제거 되었습니다.
아래와 같이 추가하면 php 7 에서도 함수를 사용할 수 있습니다
php 5.x 와 php 7.x 에서는 value 값의 위치가 달라지므로 적용할때 주의가 필요합니다
테스트 : https://www.happyjung.com/demo/php/mcrypt.php
<?php
if (!function_exists('hex2bin')) {
function hex2bin($hexdata) {
$bindata="";
for ($i=0;$i<strlen($hexdata);$i+=2) {
$bindata.=chr(hexdec(substr($hexdata,$i,2)));
}
return $bindata;
}
}
if (!function_exists('toPkcs7')) {
function toPkcs7 ($value) {
if ( is_null ($value) )
$value = "";
$padSize = 16 - (strlen ($value) % 16);
return $value . str_repeat (chr ($padSize), $padSize);
}
}
if (!function_exists('fromPkcs7')) {
function fromPkcs7 ($value) {
$valueLen = strlen ($value);
if ( $valueLen % 16 > 0 )
$value = "";
$padSize = ord ($value{$valueLen - 1});
if ( ($padSize < 1) or ($padSize > 16) )
$value = "";
// Check padding.
for ($i = 0; $i < $padSize; $i++) {
if ( ord ($value{$valueLen - $i - 1}) != $padSize )
$value = "";
}
return substr($value, 0, $valueLen - $padSize);
}
}
if (!function_exists('encrypt')) { // mcrypt_encrypt 암호화
function encrypt ($key, $value, $IV) {
if ( is_null ($value) )
$value = "";
$value = toPkcs7 ($value);
$output = openssl_encrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
return base64_encode ($output);
}
}
if (!function_exists('decrypt')) { // mcrypt_decrypt 복호화
function decrypt ($key, $value, $IV) {
if ( is_null ($value) )
$value = "";
$value = base64_decode ($value) ;
$output = openssl_decrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
return fromPkcs7 ($output);
}
}
// 암호화 양방향 키선언
$mcrypt_key = hex2bin("edc29ecfc7f0a0611014d768bbf38VIS"); //
$mcrypt_iv = hex2bin("91b985180c4873e8a0acf8af084adVIS"); //
$mcrypt_value = "해피정닷컴?ABCDEFG!@#$%^&*12345678";
echo $mcrypt_value ."<br><br>";
// 암호화
$mcrypt_value = encrypt($mcrypt_key, $mcrypt_value, $mcrypt_iv);
echo("암호화 256-bit encrypted : {$mcrypt_value} <br><br>");
// 복호화
$mcrypt_value = decrypt($mcrypt_key, $mcrypt_value, $mcrypt_iv);
echo("복호화 256-bit decrypted : {$mcrypt_value} <br><br>");
?>
참고자료
https://www.php.net/manual/en/function.mcrypt-decrypt.php
https://note-it.tistory.com/21
https://tempuss.tistory.com/entry/PHP-mcrypt-함수-마이그레이션
https://www.php.net/manual/en/function.openssl-encrypt.php
https://www.php.net/manual/en/function.mcrypt-encrypt.php
댓글목록
등록된 댓글이 없습니다.