Framework

전자정부프레임워크 ARIA 블록 알고리즘 암호화 복호화

카피코딩 2019. 9. 7. 13:58


작업 환경

 eGovFramework Version : 3.8

Eclipse Version : Oxygen.3a Release (4.7.3a)

JDK Version : 1.8


양방향 암호화 복호화를 해야 하는 경우에 사용하는 알고리즘으로 아리아(ARIA) 알고리즘에 대한 위키에 있는 설명을 참조하면

 아리아(ARIA) 대한민국 국가보안기술연구소에서 개발한 블록 암호 체계이다. ARIA라는 이름은 학계(Academy), 연구소(Research Institute), 정부 기관(Agency) 공동으로 개발한 특징을 함축적으로 표현한 것이다2004 산업자원부 KS 인증(KS X 1213:2004) 획득하여 현재까지 대한민국의 국가 표준 암호 알고리즘으로 기능하고 있으며2010  표준 하나가 되었다.


라고 되어 있습니다사용법은 상당히 간단하게 되어 있습니다.


1. pom.xml

다음 항목이 pom.xml 에 포함되어 있는지 확인을 하고 없으면 추가해 줍니다.

        <dependency>

            <groupId>egovframework.rte</groupId>

            <artifactId>egovframework.rte.fdl.crypto</artifactId>

            <version>${egovframework.rte.version}</version>

        </dependency>

 

 

2. globals.properties


globals.properties에 설정 값을 추가해 줍니다.

# Message digest algorithm using EgovPasswordEncoder..

crypto.password.algorithm=SHA-256

#crypto.plain.password=egovframe #이건 프로그램에 하드코딩 필요

# hashed password (ex: egovframe (SHA-256) => gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=)

crypto.hashed.password=gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=

Service 프로그램에서 사용하게 키값들 입니다.

 

3. context-ariacrypto.xml 추가

 

ARIA 알고리즘을 사용할 수 있도록 설정을 하기 위해 /resources/egovframework/spring/com/ 위치에 xml 파일을 생성 합니다.




package explorer 로 보면 다음과 같은 위치 입니다.



 

        <bean id="egov.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="locations">

            <list>

                <value>classpath:/egovframework/egovProps/globals.properties</value>

                <!-- value>file:/product/jeus/egovProps/globals.properties</value-->

            </list>

        </property>

    </bean>

   

    <bean id="passwordEncoder" class="egovframework.rte.fdl.cryptography.EgovPasswordEncoder">

        <property name="algorithm" value="${crypto.password.algorithm}" /><!-- default : SHA-256 -->

        <property name="hashedPassword" value="${crypto.hashed.password}" />

    </bean>

   

    <bean id="ARIACryptoService" class="egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl">

        <property name="passwordEncoder" ref="passwordEncoder" />

        <property name="blockSize" value="1025" /><!-- default : 1024 -->

    </bean>

   

    <bean id="digestService" class="egovframework.rte.fdl.cryptography.impl.EgovDigestServiceImpl">

        <property name="algorithm" value="SHA-256" /><!-- default : SHA-256 -->

        <property name="plainDigest" value="false" /><!-- default : false -->

    </bean>

 

 

4. package 및 파일 생성

이제 알고리즘을 이용하여 프로그램을 작성 하기 위해 그럴싸한 이름으로 service web 패키지를 생성 합니다.

package copycoding.com.util.crypto.service;



package copycoding.com.util.crypto.web;



service 에는 실제 암호화 복호화를 진행할 서비스 파일을 생성 합니다.

CryptoARIAService.java에 실제 암호 모듈을 넣고 CryptoARIAController.java에 화면에서 호출하는함수를 작성 합니다.

 

4.1 CryptoARIAService.java

 

@Resource(name="ARIACryptoService")

EgovCryptoService cryptoService;

       

@Resource(name = "passwordEncoder")

private EgovPasswordEncoder passwordEncoder;

       

public static String plainPassword = "egovframe";   

//EgovProperties.getProperty("crypto.plain.password");

public static String passwdAlgorithm = EgovProperties.getProperty("crypto.password.algorithm");

       

public String encryptData(String plainText) {

        String encodeText = null;

              

        try {

               byte[] encrypted = cryptoService.encrypt(plainText.getBytes("UTF-8"), plainPassword);

               encodeText = Base64.encodeBase64String(encrypted);

        } catch (UnsupportedEncodingException uee) {

            uee.printStackTrace();

        }

              

        return encodeText;

}

       

       

public String decryptData(String encodeText) {

        String plainText = null;

        try {

               byte[] base64dec = Base64.decodeBase64(encodeText);

               byte[] decrypted = cryptoService.decrypt(base64dec, plainPassword);

                      

                       plainText = new String(decrypted, "UTF-8");

        } catch (UnsupportedEncodingException uee) {

            uee.printStackTrace();

        }

       

        return plainText;

}

 

일반 텍스트를 받아 암호화 하는 함수와 encryptData(String plainText)  암호화된 텍스트를 받아 복호화 하는 함수 decryptData(String encodeText)를 구현 합니다.

 

4.2 CryptoARIAController.java


@Resource(name = "cryptoService")

private CryptoARIAService cryptoService;

       

@RequestMapping("/copycoding/cryptoAriaTest.do")

public void cryptoEncryptTest(ModelMap model) {

              

        String plainText = "암호화 해보아요!";

              

        String encryptText = cryptoService.encryptData(plainText);

        LOGGER.debug("encrypt :" + encryptText);

 

        plainText = cryptoService.decryptData(encryptText);

        LOGGER.debug("encrypt :" + plainText);

              

}

 

Service에 구현된 암호화와 복호화를 호출하여 처리를 하는 모듈을 만듭니다.

잘 작동 되는지 Debug 모드로 확인을 해 봅니다.

http://localhost:7001/CopyCoding/copycoding/cryptoAriaTest.do



암호화가 잘 되었습니다.



복호화도 잘 되는군요.

 

 

5. 전체 소스

 

CryptoARIAService.java


package copycoding.com.util.crypto.service;

 

import java.io.UnsupportedEncodingException;

 

import javax.annotation.Resource;

 

import org.apache.commons.net.util.Base64;

import org.springframework.stereotype.Service;

 

import egovframework.com.cmm.service.EgovProperties;

import egovframework.rte.fdl.cryptography.EgovCryptoService;

import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;

 

@Service("cryptoService")

public class CryptoARIAService {

 

        @Resource(name="ARIACryptoService")

        EgovCryptoService cryptoService;

       

        @Resource(name = "passwordEncoder")

        private EgovPasswordEncoder passwordEncoder;

       

        public static String plainPassword = "egovframe";   

         public static String passwdAlgorithm = EgovProperties.getProperty("crypto.password.algorithm");

       

        public String encryptData(String plainText) {

               String encodeText = null;

              

               try {

                       byte[] encrypted = cryptoService.encrypt(plainText.getBytes("UTF-8"), plainPassword);

                       encodeText = Base64.encodeBase64String(encrypted);

               } catch (UnsupportedEncodingException uee) {

                   uee.printStackTrace();

               }

              

               return encodeText;

        }

       

        public String decryptData(String encodeText) {

               String plainText = null;

               try {

                       byte[] base64dec = Base64.decodeBase64(encodeText);

                       byte[] decrypted = cryptoService.decrypt(base64dec, plainPassword);

                      

                       plainText = new String(decrypted, "UTF-8");

               } catch (UnsupportedEncodingException uee) {

                   uee.printStackTrace();

               }

              

               return plainText;

        }

} 

 

CryptoARIAController.java


package copycoding.com.util.crypto.web;

 

import javax.annotation.Resource;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

 

import copycoding.com.util.crypto.service.CryptoARIAService;

 

@Controller

public class CryptoARIAController {

        private static final Logger LOGGER = LoggerFactory.getLogger(CryptoARIAController.class);

       

        @Resource(name = "cryptoService")

        private CryptoARIAService cryptoService;

       

        @RequestMapping("/copycoding/cryptoAriaTest.do")

        public void cryptoEncryptTest(ModelMap model) {

               String plainText = "암호화 해보아요!";

              

               String encryptText = cryptoService.encryptData(plainText);

               LOGGER.debug("encrypt :" + encryptText);

 

               plainText = cryptoService.decryptData(encryptText);

               LOGGER.debug("encrypt :" + plainText);

        }

} 


- copy coding -