Processing data.
Please wait a moment...
[공동인증용] 사업장 총괄카드 조회
공동인증서를 통해 고용산재토탈서비스 사업장 총괄카드를 조회할 수 있습니다.
포인트:
60 / 트랜잭션(건)
API 호출 주소
데모:
https://api24.tilko.net
운영:
https://api24.tilko.net
/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh
▽
API 기본 가이드
API 프로세스
https://tilko.net/Docs/Step1
개발 가이드 문서
틸코 API 개발 가이드.v1.1(20211119.1030-서성원).pdf
틸코블렛.간편인증API사용가이드(20220117.0859-서성원).pdf
틸코블렛.틸코사인 제품소개서.v1.2(20210429.1436-손정민).pdf
틸코사인.공인인증서 활용 가이드.v2.7(20250925.1612-한인수).pdf
샘플 코드
개발 언어
-- 선택 --
C#
Java
Node.js
PHP
Python
▽
Request
HEADER
Method:
POST
Content-Type:
application/json
API-KEY:
API KEY (내정보 > API KEY)
ENC-KEY:
API Key 생성 시 제공받은 '공개키'로 RSA 암호화 시킨 AES Secret key 값이며, AES Secret key는 고객님이 생성한 값입니다.
BODY
Json 형식으로 보기
CertFile [필수]
String
암호화
KeyFile [필수]
String
암호화
CertPassword [필수]
String
암호화
BusinessNumber [필수]
String
암호화
UserGroupFlag [필수]
String
암호화
IndividualFlag [필수]
String
암호화
GwanriNo
String
암호화
▽
Response
Result
List
DsOutBugwaGojiSaeopjangList
List
SeWonbuNo
String
GojiGubunNm
String
JyFromDt
String
JyToDt
String
GwanriNo
String
GojiGubunSer
String
CheoriJisaCd
String
CheoriJisaNm
String
CheorijaId
String
CheorijaNm
String
GojiFgCd
String
DsOutDaepyojaChange
List
Ser
String
ChangeDt
String
JeopsuNo
String
DaepyojaNm
String
DaepyojaRgno
String
DaepyojaYn
String
DaepyojaAddr
String
DaepyojaTel
String
GitaTel
String
Email
String
BhrSeunggye
String
BhrSeunggyeDt
String
GdDaepyoStatus
String
ChwiimDt
String
HaeimDt
String
GyeoljaeStatus
String
GyeoljaeDt
String
Cheorija
String
CheoriJisa
String
GySaeopFg
String
GySaeopFgNm
String
GySaeopjangStatusCd
String
GySaeopjangStatusCdNm
String
GyEopjongCd
String
GyEopjongCdNm
String
GySdgNo
String
GySeongripDt
String
GySeunginDt
String
GySangsiInwonCnt
String
DaegyumoGieopFg
String
GySomyeolDt
String
GySomyeolSeunginDt
String
GySomyeolSayu
String
GyHsgYn
String
DsOutSaeopGaesiList
List
Seq
String
BoheomNm
String
GwanriNo
String
GongsaJijeomNm
String
GaesiDt
String
SjGaesiDt
String
GyGaesiDt
String
NewAddr
String
GongsaFromDt
String
GongsaToDt
String
TotGongsaPrc
String
SjGyeoljaeStatusNm
String
SjGyeoljaeDt
String
GyGyeoljaeStatusNm
String
GyGyeoljaeDt
String
CheoriJisaNm
String
GwanriJisaNm
String
DsOutOutBoheomJisuRateInfo
List
BoheomYear
String
SujiRate
String
IlbanJyYoyul
String
GaebyeolJyYoyul
String
JaehaeCnt
String
SjAftBhr
String
JigeupPrc
String
DsOutSaeopjangChangeInfo
List
Ser
String
ChangeDt
String
JeopsuNo
String
ChangeCnt
String
ColumnName
String
BefData
String
AftData
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
Cheorija
String
CheoriJisa
String
DsOutJingsuInfo
List
SjGaesanBoheomYear
String
SjGaesanJtBungi
String
SjGaesanSingoseoNm
String
SjGaesanSanjungGigan
String
SjGaesanFromDt
String
SjGaesanToDt
String
SjGaesanImgeumChongak
String
SjGaesanYoyul
String
SjGaesanYoyulFgNm
String
SjGaesanGyeonggamRateYn
String
SjGaesanBhr
String
SjGaesanNapbuGaesanBhr
String
SjGaesanGwabujokPrc
String
SjGaesanGwanapPrc
String
SjGaesanBunnapYn
String
SjHwakjeongBoheomYear
String
SjHwakjeongJtBungi
String
SjHwakjeongSingoseoNm
String
SjHwakjeongSanjungGigan
String
SjHwakjeongFromDt
String
SjHwakjeongToDt
String
SjHwakjeongImgeumChongak
String
SjHwakjeongYoyul
String
SjHwakjeongYoyulFgNm
String
SjHwakjeongGyeonggamRateYn
String
SjHwakjeongBhr
String
SjHwakjeongNapbuGaesanBhr
String
SjHwakjeongGwabujokPrc
String
SjHwakjeongGwanapPrc
String
SjHwakjeongBunnapYn
String
GyGaesanBoheomYear
String
GyGaesanJtBungi
String
GyGaesanSingoseoNm
String
GyGaesanSgSanjungGigan
String
GyGaesanSgFromDt
String
GyGaesanSgToDt
String
GyGaesanGjSanjungGigan
String
GyGaesanGajnFromDt
String
GyGaesanGajnToDt
String
GyGaesanSgImgeumChongak
String
GyGaesanSgYoyul
String
GyGaesanGajnImgeumChongak
String
GyGaesanGaYoyul
String
GyGaesanJnJyYoyul
String
GyGaesanYoyulFgNm
String
GyGaesanGyeonggamRateYn
String
GyGaesanGyBhr
String
GyGaesanGyNapbuGaesanBhr
String
GyGaesanGyGwabujokPrc
String
GyGaesanGyGwanapPrc
String
GyGaesanBunnapYn
String
GyHwakjeongBoheomYear
String
GyHwakjeongJtBungi
String
GyHwakjeongSingoseoNm
String
GyHwakjeongSgSanjungGigan
String
GyHwakjeongSgFromDt
String
GyHwakjeongSgToDt
String
GyHwakjeongGjSanjungGigan
String
GyHwakjeongGajnFromDt
String
GyHwakjeongGajnToDt
String
GyHwakjeongSgImgeumChongak
String
GyHwakjeongSgYoyul
String
GyHwakjeongGajnImgeumChongak
String
GyHwakjeongGaYoyul
String
GyHwakjeongJnJyYoyul
String
GyHwakjeongYoyulFgNm
String
GyHwakjeongGyeonggamRateYn
String
GyHwakjeongGyBhr
String
GyHwakjeongNapbuGaesanBhr
String
GyHwakjeongGwabujokPrc
String
GyHwakjeongGwanapPrc
String
GyHwakjeongBunnapYn
String
YoyulSanjengSangi
String
IcImgeumSangi
String
TsYn
String
HanmiSahoeBojang
String
DsOutSmSaeopjangList
List
SeWonbuNo
String
GwanriNo
String
GijunYear
String
SeokmyeonSer
String
SeokmyeonYn
String
JeopsuNo
String
JeopsuDt
String
SangsiInwonCnt
String
ChangeSayuCd
String
ChangeSayuNm
String
BIGO
String
CheoriJisaCd
String
CheoriJisaNm
String
CheorijaId
String
CheorijaNm
String
GyeoljaeStatusCd
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
DsOutMainSaeopjangList
List
seq
String
ChangeDt
String
JeopsuNo
String
MainSaeopjangChangeNm
String
BefGwanriNo
String
BefSaeopjangNm
String
AftGwanriNo
String
AftSaeopjangNm
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
LastChangejaNm
String
CheoriJisaNm
String
DsOutMinwonInfo
List
GwanriNo
String
BoheomNm
String
MinwonDocNm
String
JeopsuNo
String
JeopsuDt
String
JeopsuStatusNm
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
LastChangejaNm
String
DsOutGySunapSiljeokInfo
List
JtBhr1
String
JtBhr2
String
JtBhr3
String
JtBhr4
String
JtBhr5
String
GaesanBhr1
String
GaesanBhr2
String
GaesanBhr3
String
GaesanBhr4
String
GaesanBhr5
String
HwakjeongBhr1
String
HwakjeongBhr2
String
HwakjeongBhr3
String
HwakjeongBhr4
String
HwakjeongBhr5
String
GitaJingsugeum1
String
GitaJingsugeum2
String
GitaJingsugeum3
String
GitaJingsugeum4
String
GitaJingsugeum5
String
IwolJingsugeum1
String
IwolJingsugeum2
String
IwolJingsugeum3
String
IwolJingsugeum4
String
IwolJingsugeum5
String
Chonggye1
String
Chonggye2
String
Chonggye3
String
Chonggye4
String
Chonggye5
String
BgSanjeongBhr1
String
BgSanjeongBhr2
String
BgSanjeongBhr3
String
BgSanjeongBhr4
String
BgSanjeongBhr5
String
BgJeongsanBhr1
String
BgJeongsanBhr2
String
BgJeongsanBhr3
String
BgJeongsanBhr4
String
BgJeongsanBhr5
String
ApryuYn
String
DsOutGwanriNoChangeInfo
List
Seq
String
ChangeCheoriDt
String
JeopsuNo
String
CheoriBoheomFg
String
BefSjGwanriNo
String
BefGyGwanriNo
String
AftSjGwanriNo
String
AftGyGwanriNo
String
ChangeCheoriFg
String
SincheongSayu
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
LastChangejaNm
String
CheoriJisaNm
String
DsOutNewAddrYnInfo
List
DaepyojaNewAddrYn
String
GdDaepyojaNewAddrYn
String
SaeopjangNewAddrYn
String
GitaNewAddrYn
String
DsOutEopjongChange
List
Ser
String
ChangeDt
String
JeopsuNo
String
BoheomFg
String
EopjongJyFg
String
JyEopjongCd
String
JyEopjongNm
String
JyFromDt
String
JyToDt
String
SeunggyeFg
String
GyeoljaeStatusNm
String
GyeoljaeDt
String
CheorijaNm
String
CheoriJisaNm
String
DsOutSjSunapSiljeokInfo
List
JtBhr1
String
JtBhr2
String
JtBhr3
String
JtBhr4
String
JtBhr5
String
GaesanBhr1
String
GaesanBhr2
String
GaesanBhr3
String
GaesanBhr4
String
GaesanBhr5
String
HwakjeongBhr1
String
HwakjeongBhr2
String
HwakjeongBhr3
String
HwakjeongBhr4
String
HwakjeongBhr5
String
GitaJingsugeum1
String
GitaJingsugeum2
String
GitaJingsugeum3
String
GitaJingsugeum4
String
GitaJingsugeum5
String
IwolJingsugeum1
String
IwolJingsugeum2
String
IwolJingsugeum3
String
IwolJingsugeum4
String
IwolJingsugeum5
String
Chonggye1
String
Chonggye2
String
Chonggye3
String
Chonggye4
String
Chonggye5
String
BgSanjeongBhr1
String
BgSanjeongBhr2
String
BgSanjeongBhr3
String
BgSanjeongBhr4
String
BgSanjeongBhr5
String
BgJeongsanBhr1
String
BgJeongsanBhr2
String
BgJeongsanBhr3
String
BgJeongsanBhr4
String
BgJeongsanBhr5
String
ApryuYn
String
DsOutSaeopjangInfo
List
SeWonbuNo
String
GwanriNo
String
DaepyojaNm
String
DaepyojaRgno
String
GdDaepyoYn
String
Daeriin
String
SaeopjangNm
String
SaeopjangDdd
String
SaeopjangTel1
String
SaeopjangTel2
String
SaeopjangEmail
String
SaeopjaDrno
String
BeopinDrno
String
BonjisaFg
String
BonjisaNm
String
GwanriJisaNm
String
SaeopjangPost
String
SaeopjangGibonAddr
String
SaeopjangSangseAddr
String
JtYn
String
TotalGaipYn
String
UpyeonmulPost
String
UpyeonmulNewGibonAddr
String
UpyeonmulNewSangseAdd
String
HbYn
String
JadongicheFg
String
TsJikjongCd
String
TsJikjongNm
String
JyDamdangja
String
JingsuDamdangja
String
SangdamDamdangja
String
ChenapDamdangja
String
SjJeopsuNo
String
SjJeopsuDt
String
MainSeWonbuNo
String
MainGwanriNo
String
SaeopjangHpDdd
String
SaeopjangHpTel1
String
SaeopjangHpTel2
String
HpDdd
String
HpTel1
String
HpTel2
String
BugwaGojiYn
String
BugwaGojiNm
String
SeokmyeonYn
String
SeokmyeonNm
String
GyBhrJiwonYn
String
GyjbDamdangjaId
String
GyjbDamdangjaNm
String
JagyeokDamdangja
String
DsOutJyInfo
List
SeWonbuNo
String
GwanriNo
String
BeopinDrno
String
SaeopjaDrno
String
SjSaeopFg
String
SjSaeopFgNm
String
SjSaeopjangStatusCd
String
SjSaeopjangStatusCdNm
String
SjEopjongCd
String
SjEopjongCdNm
String
SjSdgNo
String
SjSeongripDt
String
SjSeunginDt
String
SjSangsiInwonCnt
String
MigaipJaehaeFg
String
SjSomyeolDt
String
SjSomyeolSeunginDt
String
SjSomyeolSayu
String
SjHsgYn
String
GySaeopFg
String
GySaeopFgNm
String
GySaeopjangStatusCd
String
GySaeopjangStatusCdNm
String
GyEopjongCd
String
GyEopjongCdNm
String
GySdgNo
String
GySeongripDt
String
GySeunginDt
String
GySangsiInwonCnt
String
DaegyumoGieopFg
String
GySomyeolDt
String
GySomyeolSeunginDt
String
GySomyeolSayu
String
GyHsgYn
String
DsOutJyInfoJohoe
List
SeWonbuNo
String
GwanriNo
String
BeopinDrno
String
SaeopjaDrno
String
SjSaeopFg
String
SjSaeopFgNm
String
SjSaeopjangStatusCd
String
SjSaeopjangStatusCdNm
String
SjEopjongCd
String
SjEopjongCdNm
String
SjSdgNo
String
SjSeongripDt
String
SjSeunginDt
String
SjSangsiInwonCnt
String
MigaipJaehaeFg
String
SjSomyeolDt
String
SjSomyeolSeunginDt
String
SjSomyeolSayu
String
SjHsgYn
String
GySaeopFg
String
GySaeopFgNm
String
GySaeopjangStatusCd
String
GySaeopjangStatusCdNm
String
GyEopjongCd
String
GyEopjongCdNm
String
GySdgNo
String
GySeongripDt
String
GySeunginDt
String
GySangsiInwonCnt
String
DaegyumoGieopFg
String
GySomyeolDt
String
GySomyeolSeunginDt
String
GySomyeolSayu
String
GyHsgYn
String
ApiTxKey
String
StatusSeq
Int32
ErrorCode
Int32
Message
String
ErrorLog
String
TargetCode
String
TargetMessage
String
PointBalance
String
▽
Demo
Input
API KEY:
공동인증서 프로그램 실행(필요시)
공동인증서 프로그램 다운로드(다운로드 완료 후 설치 필요)
CertFile:
KeyFile:
API 호출
Output
using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Net.Http; using System.Security.Cryptography; using System.Text; namespace UnitTest { [TestClass] public class TestCase { string apiHost = "https://api24.tilko.net"; string apiKey = "__API_KEY__"; // AES 암호화 함수 public string aesEncrypt(byte[] key, byte[] iv, byte[] plainText) { byte[] ret = new byte[0]; using (RijndaelManaged aes = new RijndaelManaged()) { aes.Key = key; aes.IV = iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using (ICryptoTransform enc = aes.CreateEncryptor(aes.Key, aes.IV)) { using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write)) { cs.Write(plainText, 0, plainText.Length); cs.FlushFinalBlock(); ret = ms.ToArray(); } } } aes.Clear(); } return Convert.ToBase64String(ret); } // AES 암호화 함수 public string aesEncrypt(byte[] key, byte[] iv, string plainText) { byte[] ret = new byte[0]; using (RijndaelManaged aes = new RijndaelManaged()) { aes.Key = key; aes.IV = iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using (ICryptoTransform enc = aes.CreateEncryptor(aes.Key, aes.IV)) { using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write)) { cs.Write(Encoding.UTF8.GetBytes(plainText), 0, Encoding.UTF8.GetBytes(plainText).Length); cs.FlushFinalBlock(); ret = ms.ToArray(); } } } aes.Clear(); } return Convert.ToBase64String(ret); } // RSA 암호화 함수 public string rsaEncrypt(string publicKey, byte[] aesKey) { string encryptedData = ""; using (RSACryptoServiceProvider rsaCSP = importPublicKey(publicKey)) { byte[] byteEncryptedData = rsaCSP.Encrypt(aesKey, false); encryptedData = Convert.ToBase64String(byteEncryptedData); rsaCSP.Dispose(); } return encryptedData; } public static RSACryptoServiceProvider importPublicKey(string pem) { string PUBLIC_HEADER = "-----BEGIN PUBLIC KEY-----"; string PUBLIC_FOOTER = "-----END PUBLIC KEY-----"; if (!pem.Contains(PUBLIC_HEADER)) { pem = PUBLIC_HEADER + Environment.NewLine + pem + Environment.NewLine + PUBLIC_FOOTER; } PemReader pr = new PemReader(new StringReader(pem)); AsymmetricKeyParameter publicKey = (AsymmetricKeyParameter)pr.ReadObject(); RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKey); RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); csp.ImportParameters(rsaParams); return csp; } // RSA 공개키(Public Key) 조회 함수 public string getPublicKey() { string rsaPublicKey = ""; using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); // 틸코 인증 서버에 RSA 공개키 요청 string url = string.Format("{0}/api/Auth/GetPublicKey?APIkey={1}", apiHost, apiKey); using (var response = httpClient.GetAsync(url).Result) { var resContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); JObject resJson = JObject.Parse(resContent); rsaPublicKey = (string)resJson["PublicKey"].ToString(); } } return rsaPublicKey; } public class Auth { public string UserId { get; set; } public string UserPassword { get; set; } } [TestMethod] public void main() { // RSA Public Key 조회 string rsaPublicKey = getPublicKey(); Debug.WriteLine("rsaPublicKey: " + rsaPublicKey); // AES Secret Key 및 IV 생성 byte[] aesKey = new byte[16]; new Random().NextBytes(aesKey); byte[] aesIv = new byte[16] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // AES Key를 RSA Public Key로 암호화 string aesCipherKey = rsaEncrypt(rsaPublicKey, aesKey); Debug.WriteLine("aesCipherKey: " + aesCipherKey); // API URL 설정 string url = apiHost + "/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh"; // API 요청 파라미터 설정 var paramObj = {{REQ_JSON}}; string bodies = JsonConvert.SerializeObject(paramObj); // API 호출 using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); httpClient.DefaultRequestHeaders.Add("API-KEY", apiKey); httpClient.DefaultRequestHeaders.Add("ENC-KEY", aesCipherKey); // 틸코 데이터 서버에 데이터 요청 var reqContent = new StringContent(bodies, Encoding.UTF8, "application/json"); using (var response = httpClient.PostAsync(url, reqContent).Result) { var resContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Debug.WriteLine("resContent: " + resContent); // 바이너리 파일 저장(해당되는 경우에만) /* JObject resJson = JObject.Parse(resContent); File.WriteAllBytes("D:\\result.bin", Convert.FromBase64String((string)resJson["Result"]["BinaryData"])); */ } } } } }
package UnitTest; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.file.Files; import java.nio.file.Paths; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.Random; import java.util.concurrent.TimeUnit; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class TestCase { String apiHost = "https://api24.tilko.net"; String apiKey = "__API_KEY__"; // AES 암호화 함수 public String aesEncrypt(byte[] key, byte[] iv, byte[] plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // JAVA의 PKCS5Padding은 PKCS7Padding과 호환 SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] byteEncryptedData = cipher.doFinal(plainText); // Base64로 인코딩 String encryptedData = new String(Base64.getEncoder().encodeToString(byteEncryptedData)); return encryptedData; } // AES 암호화 함수 public String aesEncrypt(byte[] key, byte[] iv, String plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // JAVA의 PKCS5Padding은 PKCS7Padding과 호환 SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] byteEncryptedData = cipher.doFinal(plainText.getBytes("UTF-8")); // Base64로 인코딩 String encryptedData = new String(Base64.getEncoder().encodeToString(byteEncryptedData)); return encryptedData; } // RSA 암호화 함수 public static String rsaEncrypt(String rsaPublicKey, byte[] aesKey) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { String encryptedData = null; KeyFactory keyFactory = KeyFactory.getInstance("RSA"); byte[] keyBytes = Base64.getDecoder().decode(rsaPublicKey.getBytes("UTF-8")); X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); PublicKey fileGeneratedPublicKey = keyFactory.generatePublic(spec); RSAPublicKey key = (RSAPublicKey)(fileGeneratedPublicKey); // 만들어진 공개키객체를 기반으로 암호화모드로 설정하는 과정 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, key); // 평문을 암호화하는 과정 byte[] byteEncryptedData = cipher.doFinal(aesKey); // Base64로 인코딩 encryptedData = new String(Base64.getEncoder().encodeToString(byteEncryptedData)); return encryptedData; } // RSA 공개키(Public Key) 조회 함수 public String getPublicKey() throws IOException, ParseException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(apiHost + "/api/Auth/GetPublicKey?APIkey=" + apiKey) .header("Content-Type", "application/json").build(); Response response = client.newCall(request).execute(); String responseStr = response.body().string(); JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject) jsonParser.parse(responseStr); String rsaPublicKey = (String) jsonObject.get("PublicKey"); return rsaPublicKey; } public static void main(String[] args) throws IOException, ParseException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException { TestCase tc = new TestCase(); // RSA Public Key 조회 String rsaPublicKey = tc.getPublicKey(); System.out.println("rsaPublicKey: " + rsaPublicKey); // AES Secret Key 및 IV 생성 byte[] aesKey = new byte[16]; new Random().nextBytes(aesKey); byte[] aesIv = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // AES Key를 RSA Public Key로 암호화 String aesCipherKey = rsaEncrypt(rsaPublicKey, aesKey); System.out.println("aesCipherKey: " + aesCipherKey); // API URL 설정 String url = tc.apiHost + "/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh"; // API 요청 파라미터 설정 JSONObject json = new JSONObject(); {{REQ_JSON}} // API 호출 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(url) .addHeader("API-KEY" , tc.apiKey) .addHeader("ENC-KEY" , aesCipherKey) .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), json.toJSONString())).build(); Response response = client.newCall(request).execute(); String responseStr = response.body().string(); System.out.println("responseStr: " + responseStr); // 바이너리 파일 저장(해당되는 경우에만) /* JSONParser parser = new JSONParser(); JSONObject responseJson = (JSONObject) parser.parse(responseStr); JSONObject result = (JSONObject) responseJson.get("Result"); String binaryDataStr = (String) result.get("BinaryData"); byte[] binaryData = Base64.getDecoder().decode(binaryDataStr); try (OutputStream stream = new FileOutputStream("D:\\result.bin")) { stream.write(binaryData); } */ } }
const Request = require("sync-request"); const Crypto = require("crypto"); const NodeRSA = require("node-rsa"); const FS = require("fs"); const apiHost = "https://api24.tilko.net"; const apiKey = "__API_KEY__"; // AES 암호화 함수 function aesEncrypt(key, iv, plainText) { const cipher = Crypto.createCipheriv("aes-128-cbc", key, iv); let ret = cipher.update(plainText, "utf8", "base64"); ret += cipher.final("base64"); return ret; } // RSA 암호화 함수 function rsaEncrypt(publicKey, aesKey, padding) { const key = new NodeRSA("-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----", {"encryptionScheme": padding}); return key.encrypt(aesKey, "base64", "utf8"); } // RSA 공개키(Public Key) 조회 함수 function getPublicKey() { const uri = apiHost + "/api/Auth/GetPublicKey?APIkey=" + apiKey; const options = { json: true, }; const response = Request("GET", uri, options); const rsaPublicKey = JSON.parse(response.getBody("utf8")).PublicKey; return rsaPublicKey; } // RSA Public Key 조회 const rsaPublicKey = getPublicKey(apiKey); console.log("rsaPublicKey:", rsaPublicKey); // AES Secret Key 및 IV 생성 const aesKey = Crypto.randomBytes(16); const aesIv = Buffer.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); // AES Key를 RSA Public Key로 암호화 let aesCipherKey = Buffer.alloc(0); aesCipherKey = rsaEncrypt(rsaPublicKey, aesKey, "pkcs1"); console.log("aesCipherKey:", aesCipherKey); // API URL 설정 const url = apiHost + "/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh"; // API 요청 파라미터 설정 const options = { headers: { "Content-Type" : "application/json", "API-KEY" : apiKey, "ENC-KEY" : aesCipherKey }, json: {{REQ_JSON}} }; // API 호출 const res = Request("POST", url, options); console.log("res:", res.getBody("utf8")); // 바이너리 파일 저장(해당되는 경우에만) // FS.writeFileSync("D:\\result.bin", Buffer.from(JSON.parse(res.getBody("utf-8")).Result.BinaryData, "base64"));
$url, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0 )); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true)["PublicKey"]; } // RSA Public Key 조회 $rsaPublicKey = getPublicKey($apiKey); print("rsaPublicKey:" . $rsaPublicKey); // AES Secret Key 및 IV 생성 $aesKey = random_bytes(16); $aesIv = str_repeat(chr(0), 16); // AES Key를 RSA Public Key로 암호화 $rsa = new Crypt_RSA(); $rsa->loadKey($rsaPublicKey); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $aesCipheredKey = $rsa->encrypt($aesKey); // API URL 설정 $url = $apiHost . "/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh"; // API 요청 파라미터 설정 $headers = array( "Content-Type:" . "application/json", "API-Key:" . $apiKey, "ENC-Key:" . base64_encode($aesCipheredKey), ); $json = array(); {{REQ_JSON}} // API 호출 $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode($json), CURLOPT_HTTPHEADER => $headers, CURLOPT_VERBOSE => false, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0 )); $response = curl_exec($curl); curl_close($curl); print($response); // 바이너리 파일 저장(해당되는 경우에만) // file_put_contents("D:\\result.bin", base64_decode(json_decode($response)->Result->BinaryData)); ?>
import os, json, base64 import requests from Crypto import PublicKey from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5, AES apiHost = 'https://api24.tilko.net' apiKey = '__API_KEY__' # AES 암호화 함수 def aesEncrypt(key, iv, plainText): def pad(text): text_length = len(text) amount_to_pad = AES.block_size - (text_length % AES.block_size) if amount_to_pad == 0: amount_to_pad = AES.block_size pad = chr(amount_to_pad) result = None try: result = text + str(pad * amount_to_pad).encode('utf-8') except Exception as e: result = text + str(pad * amount_to_pad) return result if type(plainText) == str: plainText = plainText.encode('utf-8') plainText = pad(plainText) cipher = AES.new(key, AES.MODE_CBC, iv) if(type(plainText) == bytes): return base64.b64encode(cipher.encrypt(plainText)).decode('utf-8') else: return base64.b64encode(cipher.encrypt(plainText.encode('utf-8'))).decode('utf-8') # RSA 암호화 함수(RSA 공개키로 AES키 암호화) def rsaEncrypt(publicKey, aesKey): rsa = RSA.importKey(base64.b64decode(publicKey)) cipher = PKCS1_v1_5.new(rsa.publickey()) aesCipherKey = cipher.encrypt(aesKey) return aesCipherKey # RSA 공개키(Public Key) 조회 함수 def getPublicKey(): headers = {'Content-Type': 'application/json'} response = requests.get(apiHost + "/api/Auth/GetPublicKey?APIkey=" + apiKey, headers=headers) return response.json()['PublicKey'] # RSA Public Key 조회 rsaPublicKey = getPublicKey() print(f"rsaPublicKey: {rsaPublicKey}") # AES Secret Key 및 IV 생성 aesKey = os.urandom(16) aesIv = ('\x00' * 16).encode('utf-8') # AES Key를 RSA Public Key로 암호화 aesCipherKey = base64.b64encode(rsaEncrypt(rsaPublicKey, aesKey)) print(f"aesCipherKey: {aesCipherKey}") # API URL 설정 url = apiHost + "/api/v1.0/kcomwel/RetrieveSaeopjangChonggwalCardJh"; # API 요청 파라미터 설정 options = { "headers": { "Content-Type" : "application/json", "API-KEY" : apiKey, "ENC-KEY" : aesCipherKey }, "json": {{REQ_JSON}}, } # API 호출 res = requests.post(url, headers=options['headers'], json=options['json']) print(f"res: {res.json()}") # 결과 저장 with open(f"D:\\Temp\\result.txt", "w", encoding='utf-8') as f: f.write(res.text) # 바이너리 파일 저장(해당되는 경우에만) ''' with open("D:\\result.bin", "wb") as f: f.write(base64.b64decode(res.json()["Result"]["BinaryData"])) '''
×
Input