암호화 함수 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 2,640건 1 페이지
  • RSS
기술자료 목록
2640
그누보드   28  2024-11-22 10:52 ~ 2024-11-22 11:03  
2639
호스팅   64  2024-11-19 14:41 ~ 2024-11-19 21:17  
2638
Linux   60  2024-11-18 15:45 ~ 2024-11-18 15:48  
2637
일반   66  2024-11-15 16:45 ~ 2024-11-15 16:46  
2636
Secure   118  2024-11-06 18:48 ~ 2024-11-06 18:50  
2635
영카트   255  2024-10-21 13:44 ~ 2024-10-21 19:42  
2634
전자결제   502  2024-09-05 09:30  
2633
MySQL   926  2024-03-29 14:14 ~ 2024-03-29 14:14  
2632
그누보드   1144  2024-02-23 18:40 ~ 2024-02-24 06:13  
2631
JavaScript   1250  2024-02-16 18:50 ~ 2024-02-16 20:37  
2630
Java   1186  2024-02-06 16:49  
2629
PHP   1376  2024-02-06 16:42  
2628
호스팅   1219  2024-01-29 12:54  
2627
PHP   1284  2024-01-26 11:04 ~ 2024-01-26 11:13  
2626
MySQL   1482  2024-01-08 17:37 ~ 2024-03-14 16:00  
2625
SQL   1577  2024-01-08 12:36  
2624
영카트   1648  2024-01-04 14:57  
2623
일반   2561  2023-12-15 18:33  
2622
Android   2052  2023-11-30 18:48 ~ 2023-11-30 19:41  
2621
전자결제   3998  2023-11-23 19:53  

검색

해피정닷컴 정보

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

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