※ 요약
윈도우 환경에 OpenSSL 개발 환경을 구축하는 방법이다.
OpenSSL은 보안 및 암호화와 관련된 라이브러리인 만큼 최신 버전으로 개발 환경을 구축하기 바란다.
※ 다운로드 주소
http://slproweb.com/products/Win32OpenSSL.html
FILE:Win32 OpenSSL v1.1.0f
/*
* AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex encoding
* AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding
*
* (암호화 방법) TEXT를 암호화 한다. > 암호화되어진코드는 READ DISABLE하다. > HEXA ENCODING을 한다.
* (복호화 방법) HEXA DECODING을 한다. > 복호화되어진 코드는 READ DISABLE하다. > 복호화를 진행한다.
*/
/* FILE PATH REGISTERED CASE
* gcc AES.c -lcrypto -o AES
* gcc AES.c -lcurl -o AES
* gcc AES.c -ljason-c -o AES
*/
/* NEEDED FILE
1. 2017-08-29 오전 08:40 3,433 aes.h
2. 2017-08-29 오전 08:46 6,610 AES_TEST.c
3. 2017-05-25 오후 09:20 928,710 libcrypto.lib
4. 2017-05-25 오후 09:20 4,155 opensslconf.h
*
* gcc -c AES_TEST.c
* gcc -o AES_TEST AES_TEST.o libcrypto.lib
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "aes.h"
#define MAX_AES_BUFF_SIZE 2048
const unsigned char fw_aes_key[16+1] = {0X33, 0X67, 0X33, 0X33, 0XAB, 0X69, 0X6C, 0XC0, 0X73, 0X30, 0X6C, 0X75, 0X74, 0X69, 0X6F, 0X6E, 0x00};
static void e_hex_convert(const void* pv, size_t len, char *outBuff) {
const unsigned char * p = (const unsigned char*)pv;
if (NULL == pv) {
return;
}
else
{
size_t i = 0;
int hexLen = 0;
char editb[8];
memset (editb, 0x00, sizeof(editb));
for (; i<len;++i) {
sprintf(editb, "%02X", *p++);
memcpy(outBuff+hexLen, editb, 2);
hexLen += 2;
}
}
return;
}
static void d_hex_convert(unsigned char *pv, size_t len, char *outBuff) {
const unsigned char * p = (const unsigned char*)pv;
int ii, kk, jj;
kk=0;
ii=0;
while(1)
{
if(ii >= len) break;
jj=0;
if(pv[ii] == 'F') pv[ii] = 15;
else if(pv[ii] == 'E') pv[ii] = 14;
else if(pv[ii] == 'D') pv[ii] = 13;
else if(pv[ii] == 'C') pv[ii] = 12;
else if(pv[ii] == 'B') pv[ii] = 11;
else if(pv[ii] == 'A') pv[ii] = 10;
else if(pv[ii] == '9') pv[ii] = 9;
else if(pv[ii] == '8') pv[ii] = 8;
else if(pv[ii] == '7') pv[ii] = 7;
else if(pv[ii] == '6') pv[ii] = 6;
else if(pv[ii] == '5') pv[ii] = 5;
else if(pv[ii] == '4') pv[ii] = 4;
else if(pv[ii] == '3') pv[ii] = 3;
else if(pv[ii] == '2') pv[ii] = 2;
else if(pv[ii] == '1') pv[ii] = 1;
else if(pv[ii] == '0') pv[ii] = 0;
if((pv[ii] & 0x08) > 0) jj = jj + 128;
if((pv[ii] & 0x04) > 0) jj = jj + 64;
if((pv[ii] & 0x02) > 0) jj = jj + 32;
if((pv[ii] & 0x01) > 0) jj = jj + 16;
if(pv[ii+1] == 'F') pv[ii+1] = 15;
else if(pv[ii+1] == 'E') pv[ii+1] = 14;
else if(pv[ii+1] == 'D') pv[ii+1] = 13;
else if(pv[ii+1] == 'C') pv[ii+1] = 12;
else if(pv[ii+1] == 'B') pv[ii+1] = 11;
else if(pv[ii+1] == 'A') pv[ii+1] = 10;
else if(pv[ii+1] == '9') pv[ii+1] = 9;
else if(pv[ii+1] == '8') pv[ii+1] = 8;
else if(pv[ii+1] == '7') pv[ii+1] = 7;
else if(pv[ii+1] == '6') pv[ii+1] = 6;
else if(pv[ii+1] == '5') pv[ii+1] = 5;
else if(pv[ii+1] == '4') pv[ii+1] = 4;
else if(pv[ii+1] == '3') pv[ii+1] = 3;
else if(pv[ii+1] == '2') pv[ii+1] = 2;
else if(pv[ii+1] == '1') pv[ii+1] = 1;
else if(pv[ii+1] == '0') pv[ii+1] = 0;
if((pv[ii+1] & 0x08) > 0) jj = jj + 8;
if((pv[ii+1] & 0x04) > 0) jj = jj + 4;
if((pv[ii+1] & 0x02) > 0) jj = jj + 2;
if((pv[ii+1] & 0x01) > 0) jj = jj + 1;
outBuff[kk] = jj;
kk = kk + 1;
ii = ii + 2;
}
return;
}
//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex encoding
static int e_makeAesPacket(char *EncryptText, int EncryptTextLen, char *DecryptText) {
AES_KEY enc_key;
long idx=0;
unsigned char padBuff[MAX_AES_BUFF_SIZE];
unsigned char encBuff[MAX_AES_BUFF_SIZE];
int ii;
const size_t encPadLen = ((EncryptTextLen + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
memset(padBuff, 0x00, MAX_AES_BUFF_SIZE);
memset(encBuff, 0x00, MAX_AES_BUFF_SIZE);
AES_set_encrypt_key(fw_aes_key, 128, &enc_key);
memcpy(padBuff, EncryptText, EncryptTextLen);
for (ii = EncryptTextLen; ii < encPadLen; ii++) {
padBuff[ii] = (encPadLen - EncryptTextLen);
}
while(idx < encPadLen) {
AES_ecb_encrypt(padBuff+idx, encBuff+idx, &enc_key, AES_ENCRYPT);
idx += AES_BLOCK_SIZE;
}
e_hex_convert(encBuff, encPadLen, DecryptText);
return(strlen(DecryptText));
}
//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding
//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding
static int d_makeAesPacket(char *DecryptText, int DecryptTextLen, char *PlainText) {
AES_KEY dec_key;
long idx=0;
unsigned char padBuff[MAX_AES_BUFF_SIZE];
unsigned char encBuff[MAX_AES_BUFF_SIZE];
unsigned char outBuff[MAX_AES_BUFF_SIZE];
int ii, kk, jj;
memset(padBuff, 0x00, MAX_AES_BUFF_SIZE);
memset(outBuff, 0x00, MAX_AES_BUFF_SIZE);
AES_set_decrypt_key(fw_aes_key, 128, &dec_key);
size_t encPadLen = strlen(DecryptText) / 2;
d_hex_convert(DecryptText, DecryptTextLen, outBuff);
while(idx < encPadLen) {
AES_ecb_encrypt(outBuff+idx, PlainText+idx, &dec_key, AES_DECRYPT);
idx += AES_BLOCK_SIZE;
}
jj=PlainText[encPadLen-1];
if(jj<=32) PlainText[encPadLen-1] = 0x00;
if(jj<=32)
for(kk=encPadLen-2; kk>0; kk--)
{
if(PlainText[kk] == jj) PlainText[kk]=0x00;
else break;
}
return(strlen(PlainText));
}
char TEXT[1204L * 128L];
int main(int argc, char *argv[])
{
char ENCRYPTEXT[MAX_AES_BUFF_SIZE];
char DECRYPTEXT[MAX_AES_BUFF_SIZE];
int ii, kk, jj;
int rlen;
memset(TEXT, 0x00, sizeof(TEXT));
strcpy(TEXT, "!@#$%^&*()(*&^%$#@!Input/Output Format from CIMS v9.00");
printf("[PLAIN TEXT]%s\n", TEXT);
printf("---------------------------------------------------------------------------------\n");
memset(ENCRYPTEXT,0x00,sizeof(ENCRYPTEXT));
memset(DECRYPTEXT,0x00,sizeof(DECRYPTEXT));
rlen = e_makeAesPacket(TEXT, strlen(TEXT), ENCRYPTEXT);
if (rlen < 0)
{
printf("AES_ENCRYPT FAILURE(%s)", TEXT);
return (-1);
}
printf("[ENCRYPT TEXT]%s\n", ENCRYPTEXT);
printf("---------------------------------------------------------------------------------\n");
rlen = d_makeAesPacket(ENCRYPTEXT,strlen(ENCRYPTEXT),DECRYPTEXT);
if (rlen < 0)
{
printf("AES_DECRYPT FAILURE(%s)", TEXT);
return (-1);
}
printf("[DECRYPT TEXT]%s\n", DECRYPTEXT);
printf("---------------------------------------------------------------------------------\n");
return(0);
}
'증권정보 > 태국' 카테고리의 다른 글
StockParser.c (by TagWire) (0) | 2020.10.22 |
---|---|
JSON데이타 파싱 샘플 프로그램 - 데이타형식은 제각각임(키포인트) (0) | 2019.10.31 |
정보분배, TagWire를 이용한 출력샘플(구조체정의및 출력) (0) | 2019.10.31 |