암호화 함수 mcrypt_encrypt 와 openssl_encrypt > 기술자료 | 해피정닷컴

암호화 함수 mcrypt_encrypt 와 openssl_encrypt > 기술자료

본문 바로가기

사이트 내 전체검색

암호화 함수 mcrypt_encrypt 와 openssl_encrypt > 기술자료

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

댓글목록

등록된 댓글이 없습니다.


Total 195건 1 페이지
  • RSS
기술자료 목록
195
PHP   1519  2024-02-06 16:42  
194
PHP   1377  2024-01-26 11:04 ~ 2024-01-26 11:13  
193
PHP   3001  2023-11-20 10:56 ~ 2023-11-20 11:14  
192
PHP   4047  2023-04-14 18:22 ~ 2023-04-14 18:40  
191
PHP   3827  2022-11-16 18:17  
190
PHP   4353  2022-11-15 11:55 ~ 2022-11-18 17:26  
189
PHP   4372  2022-10-13 20:59 ~ 2022-10-14 09:44  
188
PHP   3594  2022-10-06 14:29  
187
PHP   3096  2022-10-06 12:20 ~ 2022-10-06 12:29  
186
PHP   4213  2022-05-20 12:09 ~ 2024-03-21 15:12  
열람
PHP   7143  2022-02-27 03:45 ~ 2022-03-05 01:33  
184
PHP   5921  2021-12-20 20:32 ~ 2021-12-22 18:59  
183
PHP   7007  2021-11-09 17:52 ~ 2021-11-09 17:57  
182
PHP   6855  2021-06-30 10:40  
181
PHP   8187  2021-03-04 19:10 ~ 2021-06-22 00:03  
180
PHP   6929  2021-03-03 16:20 ~ 2021-03-03 16:21  
179
PHP   11654  2021-01-20 12:07 ~ 2021-01-27 13:35  
178
PHP   7282  2020-11-08 13:01 ~ 2020-11-08 13:03  
177
PHP   8365  2020-11-06 20:08  
176
PHP   9042  2020-08-06 11:54 ~ 2022-12-14 13:44  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.