From e705b8fcebd34bd489a9f74cf2a79ece1fa664ea Mon Sep 17 00:00:00 2001 From: yunjy-hp Date: Wed, 7 Jan 2026 16:44:31 +0900 Subject: [PATCH 1/5] =?UTF-8?q?ElinkTransactionContext=20=EC=9E=91?= =?UTF-8?q?=EC=97=85(=EB=B3=80=ED=99=98=20=ED=95=A8=EC=88=98=EC=97=90=20?= =?UTF-8?q?=EA=B0=92=20=EC=A0=84=EB=8B=AC=20=EC=B2=B4=EA=B3=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/transformer/function/crypto/SeedKJDecrypt.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java index 3243243..afdc466 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java @@ -2,6 +2,7 @@ package com.eactive.eai.transformer.function.crypto; import java.util.Stack; +import com.eactive.eai.common.context.ElinkTransactionContext; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; @@ -22,8 +23,12 @@ public class SeedKJDecrypt extends PostfixMathCommand { public void run(Stack inStack) throws ParseException { checkStack(inStack); - - // USER FUNCTION에서 Parameter 에서 가져옴 + + //샘플 + String seedSalt = ElinkTransactionContext.getSeedSalt(); + System.out.println("seedSalt = " + seedSalt); + + // USER FUNCTION에서 Parameter 에서 가져옴 Object param2 = inStack.pop(); String param2Str = String.valueOf(param2); // null 안전 처리 String decryptKey = StringUtils.leftPad(param2Str, 16, '0'); From bf1b03061bea9e1e8c81ab7bc7497133cdd29745 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 8 Jan 2026 09:45:47 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/transformer/function/crypto/SeedKJDecrypt.java | 10 ++++++++-- .../eai/transformer/function/crypto/SeedKJEncrypt.java | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java index 3243243..67bffbf 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java @@ -2,6 +2,7 @@ package com.eactive.eai.transformer.function.crypto; import java.util.Stack; +import com.eactive.eai.common.context.ElinkTransactionContext; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; @@ -22,8 +23,12 @@ public class SeedKJDecrypt extends PostfixMathCommand { public void run(Stack inStack) throws ParseException { checkStack(inStack); - - // USER FUNCTION에서 Parameter 에서 가져옴 + + //샘플 + String seedSalt = ElinkTransactionContext.getSeedSalt(); + System.out.println("seedSalt = " + seedSalt); + + // USER FUNCTION에서 Parameter 에서 가져옴 Object param2 = inStack.pop(); String param2Str = String.valueOf(param2); // null 안전 처리 String decryptKey = StringUtils.leftPad(param2Str, 16, '0'); @@ -61,3 +66,4 @@ public class SeedKJDecrypt extends PostfixMathCommand { } } } + diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java index f2141e0..29c3e31 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java @@ -61,4 +61,4 @@ public class SeedKJEncrypt extends PostfixMathCommand { throw new ParseException(e.getMessage(), e); } } -} \ No newline at end of file +} From bfa74e5d7e4e50b2f01c453b79210168ba2ee204 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 8 Jan 2026 09:46:33 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eactive/eai/transformer/function/crypto/SeedKJDecrypt.java | 2 +- .../eactive/eai/transformer/function/crypto/SeedKJEncrypt.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java index 67bffbf..de74049 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java @@ -48,7 +48,7 @@ public class SeedKJDecrypt extends PostfixMathCommand { value =((Number) param).toString().getBytes(); } } else if (param instanceof Number) { - value = ((Number) param).toString().getBytes(); + value = ((Number) param).toString().getBytes(); } else if (param == null) { inStack.push(null); return; diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java index 29c3e31..60655d6 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java @@ -5,7 +5,7 @@ import java.util.Stack; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; -import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.property.PropManager; import java.nio.charset.StandardCharsets; From e947a0ca7ae5a50e1f9a2ac7adb1435413537081 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 8 Jan 2026 09:48:27 +0900 Subject: [PATCH 4/5] =?UTF-8?q?partner=20code=EB=A5=BC=20key=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/crypto/SeedKJDecrypt.java | 32 +++++++------------ .../function/crypto/SeedKJEncrypt.java | 24 +++++++------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java index de74049..f22dbc1 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJDecrypt.java @@ -2,36 +2,27 @@ package com.eactive.eai.transformer.function.crypto; import java.util.Stack; -import com.eactive.eai.common.context.ElinkTransactionContext; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; - -import com.eactive.eai.common.property.PropManager; - import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.StringUtils; // kj bank import 2025-09-23 jwhong -//import org.kjbank.simple.core.crypto.seed.SeedUtil; -import com.eactive.eai.common.seed.SeedKJ; - +//import com.eactive.eai.common.seed.SeedKJ; +//security-1.0.0.jar 사용으로 변경 2026-01-05 +import com.eactive.eai.security.seed.Seed; +import com.eactive.eai.common.context.ElinkTransactionContext; public class SeedKJDecrypt extends PostfixMathCommand { public SeedKJDecrypt() { - numberOfParameters = 2; + numberOfParameters = 1; } public void run(Stack inStack) throws ParseException { checkStack(inStack); - - //샘플 - String seedSalt = ElinkTransactionContext.getSeedSalt(); - System.out.println("seedSalt = " + seedSalt); - - // USER FUNCTION에서 Parameter 에서 가져옴 - Object param2 = inStack.pop(); - String param2Str = String.valueOf(param2); // null 안전 처리 - String decryptKey = StringUtils.leftPad(param2Str, 16, '0'); + + String seedKey = ElinkTransactionContext.getSeedKey(); + String decryptKey = StringUtils.leftPad(seedKey, 16, '0'); Object param = inStack.pop(); @@ -48,7 +39,7 @@ public class SeedKJDecrypt extends PostfixMathCommand { value =((Number) param).toString().getBytes(); } } else if (param instanceof Number) { - value = ((Number) param).toString().getBytes(); + value = ((Number) param).toString().getBytes(); } else if (param == null) { inStack.push(null); return; @@ -57,8 +48,8 @@ public class SeedKJDecrypt extends PostfixMathCommand { } try { - String decryptedData = SeedKJ.decrypt(new String(value, StandardCharsets.UTF_8), decryptKey); - + String decryptedData = Seed.decrypt(decryptKey, new String(value, StandardCharsets.UTF_8)); + inStack.push(decryptedData); } catch (Exception e) { //throw new ExecutionException(e.getMessage(), parameters, e); @@ -66,4 +57,3 @@ public class SeedKJDecrypt extends PostfixMathCommand { } } } - diff --git a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java index 60655d6..9af4702 100644 --- a/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java +++ b/src/main/java/com/eactive/eai/transformer/function/crypto/SeedKJEncrypt.java @@ -5,29 +5,27 @@ import java.util.Stack; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; -import com.eactive.eai.common.property.PropManager; - import java.nio.charset.StandardCharsets; -// kj bank import 2025-09-23 jwhong -import com.eactive.eai.common.seed.SeedKJ; -import com.eactive.eai.common.seed.SeedCipher; +// security-1.0.0.jar 사용으로 변경 2026-01-05 +import com.eactive.eai.security.seed.Seed; +//kj bank import 2025-09-23 jwhong +//import com.eactive.eai.common.seed.SeedKJ; + import org.apache.commons.lang3.StringUtils; import java.util.Base64; -//import org.kjbank.simple.core.crypto.seed.SeedUtil; +import com.eactive.eai.common.context.ElinkTransactionContext; public class SeedKJEncrypt extends PostfixMathCommand { public SeedKJEncrypt() { - numberOfParameters = 2; + numberOfParameters = 1; } public void run(Stack inStack) throws ParseException { checkStack(inStack); - // USER FUNCTION에서 Parameter 에서 가져옴 - Object param2 = inStack.pop(); - String param2Str = String.valueOf(param2); // null 안전 처리 - String encryptKey = StringUtils.leftPad(param2Str, 16, '0'); + String seedKey = ElinkTransactionContext.getSeedKey(); + String encryptKey = StringUtils.leftPad(seedKey, 16, '0'); Object param = inStack.pop(); @@ -53,7 +51,7 @@ public class SeedKJEncrypt extends PostfixMathCommand { } try { - String encryptedData = SeedKJ.encrypt(new String(value, StandardCharsets.UTF_8), encryptKey); + String encryptedData = Seed.encrypt(encryptKey, new String(value, StandardCharsets.UTF_8)); inStack.push(encryptedData); } catch (Exception e) { @@ -61,4 +59,4 @@ public class SeedKJEncrypt extends PostfixMathCommand { throw new ParseException(e.getMessage(), e); } } -} +} \ No newline at end of file From ea0bfd0afca8bcfda960e7af9df60204a0f154c0 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 8 Jan 2026 13:44:39 +0900 Subject: [PATCH 5/5] =?UTF-8?q?seed=20libaray=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/security-1.0.0.jar | Bin 0 -> 19023 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 libs/security-1.0.0.jar diff --git a/libs/security-1.0.0.jar b/libs/security-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..2e46994ff3b220be263c8e8b7c9e267b2d9e08af GIT binary patch literal 19023 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 literal 0 HcmV?d00001