자작이며, 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;
/
[PHP / Crypt / MD5Crypt]암호화, 복호화 Class (ADOdb의 crypt.inc.php
[C# / .NET / Crypt / HxCrypt]암호화, 복호화 Class
[ORACLE / PL/SQL / Crypt / HxCrypt]암호화, 복호화 PACKAGE(Class)
'Workspace & Develop > Library' 카테고리의 다른 글
[Component/.NET] Krypton Suite of .NET WinForms Controls (0) | 2021.09.27 |
---|---|
[C# / .NET / Crypt / HxCrypt]암호화, 복호화 Class (0) | 2018.05.10 |
[PHP / Crypt / MD5Crypt]암호화, 복호화 Class (ADOdb의 crypt.inc.php) (0) | 2018.05.10 |