관리 메뉴

nalaolla

DBMS_CRYPTO를 이용한 AES256 알고리즘 암호화/복호화 본문

ORACLE

DBMS_CRYPTO를 이용한 AES256 알고리즘 암호화/복호화

날아올라↗↗ 2015. 12. 23. 23:34
728x90

***************************************************************************

  암호화

 ******************************************************************************/

 FUNCTION ENC_AES ( input_string IN VARCHAR2

 ) RETURN VARCHAR2;

 

 

/******************************************************************************

  복호화

 ******************************************************************************/

 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2

 ) RETURN VARCHAR2;                       

 

END CRYPTO_AES256;

/

 

Body Script

 

CREATE OR REPLACE PACKAGE BODY [유저명].CRYPTO_AES256

IS

 

/******************************************************************************

  암호화

 ******************************************************************************/

 FUNCTION ENC_AES ( input_string IN VARCHAR2

 ) RETURN VARCHAR2

 IS

   

   encrypted_raw      RAW (2000);             -- 암호화된 RAW타입 데이터

   key_bytes_raw      RAW (32);               -- 암호화 KEY (32RAW => 32Byte => 256bit)

   encryption_type    PLS_INTEGER :=          -- 암호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

      

        key_bytes_raw :=UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        encrypted_raw := DBMS_CRYPTO.ENCRYPT

            (

                src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),

                typ => encryption_type,

                key => key_bytes_raw

            );

      

        -- 에러 방지를 위해 base64_encode 인코딩 처리..

        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

        RETURNUTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));

       

    END ENC_AES;

 

 

/******************************************************************************

  복호화

 ******************************************************************************/

 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2

 ) RETURN VARCHAR2

IS

 

   output_string      VARCHAR2 (200);         -- 복호화된 문자열

   decrypted_raw      RAW (2000);             -- 복호화된 raw타입 데이터

   key_bytes_raw      RAW (32);               -- 256bit 암호화 key

   encryption_type    PLS_INTEGER :=          -- 복호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

   

        key_bytes_raw :=UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        decrypted_raw := DBMS_CRYPTO.DECRYPT

            (

                -- 에러 방지를 위해 base64_decode 인코딩 처리..

                -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

                src =>UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_raw)),

                typ => encryption_type,

                key => key_bytes_raw

            );

       output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

    

       RETURN output_string;

      

    END DEC_AES;                       

 

END CRYPTO_AES256;

/

 

각자 원하는 키코드(32byte) 부분을 수정하면 해당 키로만 복호화 할 수 있는 암호화 문자열이 생성됩니다.

 

만약 다음과 같은 에러가 발생될시 조치방법

 

PACKAGE BODY [유저명].CRYPTO_AES256

On line:  7

PLS-00323: 부프로그램 또는 'ENC_AES' 커서는 패키지 지정에 정의되고 패키지 본체에 나타나야합니다

 

Body Script를 긁어서 프로그램 코드를 직접제거하고, Head에 들어가는 형식으로 직접 수정 합니다.

그리고 Head생성 후 Body 생성..

Head와 Body에 문자열이든 어떤것이든 형식이 일치하지 않는다는 에러입니다.

728x90