티스토리 뷰

반응형

CREATE OR REPLACE PACKAGE DSTM_3DES

  IS
/*******************************************************************************
PURPOSE  : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 3DES(Triple DES) 암호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_get_Enc_3DES_val
    (
        p_source_plain_text     VARCHAR2,        -- 평문 입력 문자열
        p_enc_key_str           VARCHAR2         -- 암호화 키
    )
    RETURN VARCHAR2;


/*******************************************************************************
PURPOSE  : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 3DES(Triple DES) 복호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_get_Dec_3DES_val
    (
        p_source_plain_text     VARCHAR2,        -- 암호화된 입력 문자열
        p_dec_key_str           VARCHAR2         -- 복호화 키
    )
    RETURN VARCHAR2;

    FUNCTION TestP
    RETURN VARCHAR2;


END; -- Package spec
/

CREATE OR REPLACE PACKAGE BODY DSTM_3DES
IS
/*******************************************************************************
PURPOSE  : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 3DES(Triple DES) 암호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_get_Enc_3DES_val
    (
        p_source_plain_text     IN VARCHAR2,        -- 평문 입력 문자열
        p_enc_key_str           IN VARCHAR2         -- 암호화 키
    )
    RETURN VARCHAR2
    IS
        v_source_plain_txt_b64  VARCHAR2(4000);     -- BASE64 로 인코딩된 문자열
        v_crypt_input_length    NUMBER;             -- 암호화하기 전의 문자열 크기
        v_crypt_input_div       NUMBER;             /* DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt Function 의
                                                       입력 문자열(input_string) 크기가 8바이트 한정이므로
                                                       8바이트 단위로 나눈 문자열의 Substring 반복 처리 횟수 값 */
        v_crypt_input_mod       NUMBER;             -- 8바이트 단위로 나누고 남은 나머지 값
        v_crypt_enc_cnt         BINARY_INTEGER Default 0;       /* 8바이트 단위로 암호화 처리시
                                                                   반복처리 비교 값 */
        v_input_string_source   VARCHAR2(4000);     /* 암호화를 위해 BASE64 로 인코딩된 문자열 크기와
                                                       BASE64 로 인코딩된 문자열 합친 문자열
                                                       (입력문자열크기+'.'+입력문자열)*/
        v_input_string_tmp      VARCHAR2(8);        -- 8바이트 단위 임시 문자열
        v_enc_str_tmp           VARCHAR2(4000);     -- 암호화된 임시 문자열
        v_enc_str_tmp_raw       RAW(4000);          -- RAW 타입으로 변환된 임시 문자열
        v_ret_enc_str_raw       RAW(4000);          -- RAW 터압으로 변환된 리턴될 암호화 문자열
    BEGIN

        v_source_plain_txt_b64  := DBMS_RANDOM.string('p',3) || p_source_plain_text;
        --v_source_plain_txt_b64  := p_source_plain_text;
--        v_source_plain_txt_b64  := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_source_plain_txt_b64)));
        v_source_plain_txt_b64  := UTL_RAW.cast_to_raw(v_source_plain_txt_b64);
        v_source_plain_txt_b64  := UTL_ENCODE.base64_encode(v_source_plain_txt_b64);
        v_source_plain_txt_b64  := UTL_RAW.cast_to_varchar2(v_source_plain_txt_b64);
        v_crypt_input_length    := LENGTH(v_source_plain_txt_b64)+1;
        v_input_string_source   := v_crypt_input_length ||'.' || v_source_plain_txt_b64;
        v_crypt_input_div       := TRUNC((v_crypt_input_length+1)/8);
        v_crypt_input_mod       := MOD((v_crypt_input_length+1), 8);

        FOR v_crypt_enc_cnt IN 1..(v_crypt_input_div+1) LOOP
            v_input_string_tmp  := RPAD(SUBSTR(v_input_string_source, (v_crypt_enc_cnt-1)*8+1, 8),8,' ');
            v_enc_str_tmp       := DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt( input_string => v_input_string_tmp
                                                                      , key_string => p_enc_key_str);
            v_enc_str_tmp_raw   := UTL_RAW.cast_to_raw(v_enc_str_tmp);
            v_ret_enc_str_raw   := v_ret_enc_str_raw || v_enc_str_tmp_raw;
        END LOOP;

        RETURN v_ret_enc_str_raw;

        EXCEPTION
            WHEN OTHERS THEN
                RAISE;

    END f_get_Enc_3DES_val;

/*******************************************************************************
PURPOSE  : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 3DES(Triple DES) 복호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_get_Dec_3DES_val
    (
        p_source_plain_text     IN VARCHAR2,        -- 암호화된 입력 문자열
        p_dec_key_str           IN VARCHAR2         -- 복호화 키
    )
    RETURN VARCHAR2
    IS
        v_crypt_input_length    NUMBER;             -- 복호화하기 전의 문자열 크기
        v_crypt_input_div       NUMBER;             /* DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt Function 의
                                                       입력 문자열(input_string) 크기가 8바이트 한정이므로
                                                       8바이트 단위로 나눈 문자열 Substring 반복 처리 횟수 값 */
        v_crypt_dec_cnt         BINARY_INTEGER Default 0;       /* 8바이트 단위로 복호화 처리시
                                                                   반복처리 비교 값 */
        v_input_string_source   VARCHAR2(4000);     -- 복호화 처리를 위한 암호화된 입력 문자열
        v_input_string_tmp      VARCHAR2(4000);     -- Varchar2 타입으로 변환된 임시 문자열
        v_dec_str_tmp           VARCHAR2(4000);     -- 복호화된 임시 문자열
        v_crypt_str_tmp         VARCHAR2(8);        -- 8바이트 단위 임시 문자열
        v_dec_str               VARCHAR2(4000);     -- 복호화된 문자열
        v_dec_str_length        NUMBER Default 0;   -- 복호화할 문자열의 크기
        v_dec_str_txt_b64       VARCHAR2(4000);     -- BASE64 디코딩 문자열
        v_ret_dec_str           VARCHAR2(4000);     -- 리턴될 복호화 문자열

    BEGIN

        v_input_string_source   := p_source_plain_text;
        v_crypt_input_length    := LENGTH(p_source_plain_text);
        v_crypt_input_div       := TRUNC((v_crypt_input_length)/(8*2));

        FOR v_crypt_dec_cnt IN 1..v_crypt_input_div LOOP
            v_input_string_tmp  := SUBSTR(v_input_string_source, (v_crypt_dec_cnt-1)*(8*2)+1, 8*2);
            v_crypt_str_tmp     := UTL_RAW.cast_to_varchar2(v_input_string_tmp);
            v_dec_str_tmp       := DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt( input_string => v_crypt_str_tmp
                                                                       , key_string => p_dec_key_str);
            v_dec_str           := v_dec_str ||  v_dec_str_tmp;
        END LOOP;

            v_dec_str_length    := TO_NUMBER(SUBSTR(v_dec_str, 0, TO_NUMBER(INSTR(v_dec_str, '.', 1)) - 1 ));
            v_dec_str_txt_b64   := SUBSTR( RTRIM(v_dec_str)
                                         , TO_NUMBER(INSTR(v_dec_str, '.', 1)) + 1, v_dec_str_length);
--            v_ret_dec_str       := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_decode(UTL_RAW.cast_to_raw(v_dec_str_txt_b64)));
            v_ret_dec_str       := UTL_RAW.cast_to_raw(v_dec_str_txt_b64);
            v_ret_dec_str       := UTL_ENCODE.base64_decode(v_ret_dec_str);
            v_ret_dec_str       := UTL_RAW.cast_to_varchar2(v_ret_dec_str);
            v_ret_dec_str       := SUBSTR(v_ret_dec_str, 4);

        RETURN v_ret_dec_str;

        EXCEPTION
            WHEN OTHERS THEN
                RAISE;

    END f_get_Dec_3DES_val;

    FUNCTION TestP
    RETURN VARCHAR2
    IS
        l_var VARCHAR2(4000);
    BEGIN

        l_var := f_get_Enc_3DES_val('PORTAL','2DAE49B9205DC3E7');
    --    htp.p(l_var);
    --    htp.br;
        RETURN f_get_Dec_3DES_val(l_var,'2DAE49B9205DC3E7');
    EXCEPTION
        WHEN OTHERS THEN
            htp.p(SQLERRM);
    END TestP;
END;
/

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함