Develop의 Tistory

Workspace & Develop/Library

[ORACLE / PL/SQL / Crypt / HxCrypt]암호화, 복호화 PACKAGE(Class)

소소한 늙은 개발자의 메모장 2018. 5. 10. 14:47
반응형
(追記) (追記ここまで)

자작이며, PHP Library중 하나인 ADOdb의 crypt.inc.php의 MD5Crypt Class를 C#으로 변경 후 Oracle용 PL/SQL에 맞게 변경하였습니다.

MS-SQL, SQLite는 C#을 이용하여 DLL로 제작하여 로딩하시면 사용 가능합니다.

패키지명은 HxCrypt라고 하였습니다.

별도로 비트연산용 PKG_UTILS( http://overoid.tistory.com/35 ) / 첨부(PKG_UTILS_Oracle.sql) 참조를 이용하였습니다.

자세한 내용은 첨부파일을 참고하시기 바랍니다.

(ADODB가 GNU 라이센스이므로 공유는 당연하다 판단했습니다. / C#과 Oracle용으로 마이그레이션한 라이블러리를 공개합니다.)

PHP용 소스 출처 :http://adodb.org/

- 암호화 : HxCrypt.Encrypt(문자열, 키값) //호출 할 때마다 다른 값이 리턴됨

- 복호화 : HxCrypt.Decrypt(암호 문자열, 키값)

암호화 문자열과 키값은 반드시 키보드에 존재하는 영문+숫자+특수키 값만을 정상적으로 사용 가능하며,

기타 다른 문자(특수문자, 한글, ...)들은 문자 인코딩 타입과 플랫폼에 따라 상이한 결과가 나오므로 주의가 필요함.

[CODE]

CREATE OR REPLACE PACKAGE HxCrypt AS
/******************************************************************************
 // 출처 : userpark.net / userpark@userpark.net
 // 배포 라이센스 : GNU
 // 원 소스 출처 : http://adodb.org/ , crypt.inc.php, MD5Crypt
 NAME: HxCrypt
 PURPOSE:
 REVISIONS:
 Ver Date Author Description
 --------- ---------- --------------- ------------------------------------
 1.0 2018年05月10日 userpark 1. Created this package.
******************************************************************************/
 FUNCTION base64_encode(inputString VARCHAR2) RETURN VARCHAR2;
 FUNCTION base64_decode(inputString VARCHAR2) RETURN VARCHAR2;
 FUNCTION Md5(inputString VARCHAR2) RETURN VARCHAR2;
 FUNCTION keyED(inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
 FUNCTION Encrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
 FUNCTION Decrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
 
END HxCrypt;
/
CREATE OR REPLACE PACKAGE BODY HxCrypt AS
 outputString VARCHAR2(2000);
FUNCTION base64_encode(inputString VARCHAR2) RETURN VARCHAR2 AS
 BEGIN
 outputString := utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(inputString)));
 RETURN outputString;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
 END base64_encode;
 
 FUNCTION base64_decode(inputString VARCHAR2) RETURN VARCHAR2 AS
 BEGIN
 outputString := utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(inputString)));
 RETURN outputString;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
 END base64_decode;
 
 FUNCTION Md5(inputString VARCHAR2) RETURN VARCHAR2 AS
 BEGIN
 --outputString := Md5(inputString);
 outputString := LOWER(RAWTOHEX(UTL_RAW.CAST_TO_RAW(sys.dbms_obfuscation_toolkit.md5(input_string => inputString))));
 RETURN outputString;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
 END Md5;
 
 FUNCTION KeyED (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
ctr NUMBER := 0;
i NUMBER := 0;
nInput NUMBER := 0;
nKey NUMBER := 0;
keyValue VARCHAR2(2000);
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
BEGIN
 i := 1;
 keyValue := Md5(inputKey);
 nInput := LENGTH(inputValue);
 nKey := LENGTH(keyValue);
 ctr := 1;
 outputString := null;
 WHILE i <= nInput LOOP IF ctr = nKey THEN ctr := 1; END IF; --utl_raw.cast_to_raw(inputString) iTxt := ASCII(SUBSTR(TO_CHAR(inputValue), i, 1)); --iTxt := utl_raw.cast_to_raw(SUBSTR(TO_CHAR(inputString), i + 1, 1)); iKey := ASCII(SUBSTR(TO_CHAR(keyValue), ctr, 1)); --iKey := utl_raw.cast_to_raw(SUBSTR(TO_CHAR(keyValue), ctr + 1, 1)); --iVal := iTxt ^ iKey; iVal := PKG_UTILS.BITXOR(iTxt,iKey); outputString := outputString || CHR(iVal); --outputString := outputString || utl_raw.cast_to_varchar2(TO_CHAR(iVal)); ctr := ctr + 1; i := i + 1; EXIT WHEN i> nInput; 
 END LOOP;
 RETURN outputString;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
END KeyED;
FUNCTION Encrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
Result VARCHAR2(2000);
ctr NUMBER := 0;
i NUMBER := 0;
n NUMBER := 0;
keyValue VARCHAR2(2000);
nKey NUMBER := 0;
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
cKey VARCHAR2(8);
BEGIN
 i := 1;
 ctr := 1;
 keyValue := Md5(TO_CHAR(CEIL(DBMS_RANDOM.VALUE(0,32000))));
 n := LENGTH(inputValue);
 nKey := LENGTH(keyValue);
 Result := null;
 WHILE i <= n LOOP IF ctr = nKey THEN ctr := 1; END IF; cKey := SUBSTR(TO_CHAR(keyValue), ctr, 1); iTxt := ASCII(SUBSTR(TO_CHAR(inputValue), i, 1)); iKey := ASCII(cKey); --iVal := iTxt ^ iKey; iVal := PKG_UTILS.BITXOR(iTxt,iKey); Result := Result || cKey || CHR(iVal); ctr := ctr + 1; i := i + 1; EXIT WHEN i> n; 
 END LOOP;
 outputString := base64_encode(KeyED(Result, inputKey));
 RETURN outputString;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
END Encrypt;
FUNCTION Decrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
i NUMBER := 0;
n NUMBER := 0;
keyValue VARCHAR2(2000);
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
BEGIN
 i := 1;
 keyValue := KeyED(base64_decode(inputValue), inputKey);
 n := LENGTH(keyValue);
 outputString := null;
 WHILE i <= n LOOP iKey := ASCII(SUBSTR(TO_CHAR(keyValue), i, 1)); i := i + 1; iTxt := ASCII(SUBSTR(TO_CHAR(keyValue), i, 1)); --iVal := iTxt ^ iKey; iVal := PKG_UTILS.BITXOR(iTxt,iKey); outputString := outputString || CHR(iVal); i := i + 1; EXIT WHEN i> n; 
 END LOOP;
 
 RETURN outputString;
 
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 NULL;
 WHEN OTHERS THEN
 -- Consider logging the error and then re-raise
 RAISE;
 
END Decrypt;
END HxCrypt;
/

HxCrypt_Oracle_userpark.sql

PKG_UTILS_Oracle.sql


[PHP / Crypt / MD5Crypt]암호화, 복호화 Class (ADOdb의 crypt.inc.php

http://userpark.net/124


[C# / .NET / Crypt / HxCrypt]암호화, 복호화 Class

http://userpark.net/125


[ORACLE / PL/SQL / Crypt / HxCrypt]암호화, 복호화 PACKAGE(Class)

http://userpark.net/126


반응형
(追記) (追記ここまで)

티스토리툴바

AltStyle によって変換されたページ (->オリジナル) /