티스토리 뷰
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;
/