※ 요약
윈도우 환경에 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);
}
 
 
  

+ Recent posts