암호화 함수 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,634건 6 페이지
  • RSS
기술자료 목록
2534
SQL   4700  2022-09-26 11:12  
2533
APP   5458  2022-09-21 16:09 ~ 2022-09-21 16:22  
2532
APP   5149  2022-09-21 16:03 ~ 2022-09-21 16:17  
2531
APP   6661  2022-09-15 13:28 ~ 2022-11-08 19:27  
2530
Search   4514  2022-09-03 15:15  
2529
MySQL   7249  2022-07-29 19:40 ~ 2022-07-29 19:49  
2528
JavaScript   7705  2022-07-28 16:08 ~ 2022-07-28 16:13  
2527
전자결제   4195  2022-07-11 15:56 ~ 2022-07-11 15:56  
2526
전자결제   3712  2022-06-17 15:29  
2525
영카트   4298  2022-06-17 00:07 ~ 2022-06-17 00:08  
2524
그누보드   3999  2022-06-11 00:52  
2523
그누보드   3582  2022-05-27 11:42 ~ 2022-05-27 11:44  
2522
일반   4579  2022-05-26 15:30  
2521
도메인   3938  2022-05-24 17:48 ~ 2022-05-24 19:00  
2520
PHP   4176  2022-05-20 12:09 ~ 2024-03-21 15:12  
2519
Adobe   6674  2022-03-21 15:11 ~ 2022-11-11 16:08  
열람
PHP   7109  2022-02-27 03:45 ~ 2022-03-05 01:33  
2517
HTML   4606  2022-01-30 10:50 ~ 2022-01-30 22:56  
2516
영카트   6449  2022-01-28 09:48 ~ 2023-01-26 01:50  
2515
그누보드   5316  2022-01-25 12:27 ~ 2022-02-01 09:59  

검색

해피정닷컴 정보

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

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