이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

보안

OpenSSL를 이용한 암/복호화, 해쉬

이쿠우우 2021. 2. 23. 20:59
반응형

 

 


OpenSSL 빌드 (Windows)

 

필요한 파일 2개

 

1) OpenSSL 소스코드 다운

Download link : https://www.openssl.org/source/

openssl-1.1.1d.tar.gz 파일을 다운 받음

 

2) Perl 설치

Download link :  http://strawberryperl.com/

perl 의 경우 exe파일로 설치를 진행

 

참고) perl 이란?

Practical Extraction and Report Language : 실용적인 레포팅 언어라는 뜻

주로 텍스트 파일에서 정보를 추출(Extract)해서

다양한 형태의 레포트(Report)를 출력해내는 용도로 사용

 

 

OpenSSL 빌드

1. C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\VC

위의 경로로 이동하시면 아래의 프로그램이 있음

VS 2017용 x64 네이티브 도구 명령 프롬프트

VS 2017용 x86 Native Tools 명령 프롬프트

64비트로 할것인지 32비트로 할것인지 선택하여 꼭 관리자 권한으로 실행

 

2. VS 2017용 x64 네이티브 도구 명령 프롬프트 관리자 권한으로 실행

 

3. cd 명령어를 사용하여 openssl 압축을 풀어준곳으로 이동합니다.

 

4. 명령어를 실행

perl Configure VC-WIN32 no-idea no-md2 no-mdc2 no-rc5 no-rc4  no-asm --prefix=d:\devel\openssl\openssl-1.0.0d_vc2010

 

perl Configure VC-WIN64A no-idea no-md2 no-mdc2 no-rc5 no-rc4  no-asm --prefix=d:\devel\openssl\openssl-1.0.0d_vc2010

 

[명령어 정리]

--prefix  C:\Program Files (x86)\OpenSSL = openssl 설치 경로 옵션

no-idea no-mdc2 no-rc5   = RC4, IDEA, MDC-2 등 상용 알고리즘 제외옵션

특허문제가 안걸리게 해주는 옵션

 

 

[오류 참고]

원인 : Activestate perl 을 설치해서 사용했을 경우 발생하는 오류

해결법 : Activestate perl 삭제 후 Strawberry Perl 로 재설치 하니까 해결됨

Strawberry Perl 링크 : http://strawberryperl.com/

 

[명령어 성공 시]

 

 

 

5. make 명령 실행

해당 창에서 그대로 아래 명령 실행

>nmake                    

>nmake install

 

6. 완료 설치 확인

상위에서 설정한 경로에 다음과 같이 폴더가 생성됨

 


 

Visual Studio 2017 OpenSSL 적용

 

1. 빈프로젝트 생성

 

2. Header 파일 적용

프로젝트 우클릭 → 속성 → 구성속성 → VC++ 디렉터리 → 포함 디렉터리

항목에 openssl include 폴더 경로 추가

예) D:\[프로젝트 경로]\OpenSSL\include

3. 정적 라이브러리 (lib) 파일 적용

프로젝트 우클릭 → 속성 → 구성속성 → VC++ 디렉터리 → 라이브러리 디렉터리

항목에 openssl lib 폴더 경로 추가

예) D:\[프로젝트 경로]\OpenSSL\lib

프로젝트 우클릭 → 속성 → 구성속성 → 링커 → 입력 → 추가 종속성

항목에 D:\[프로젝트 경로]\OpenSSL\lib 경로에 있는 lib 파일 입력

  • libcrypto.lib
  • libssl.lib

 

4. 동적 라이브러리 (dll) 파일 적용

프로젝트 우클릭 → 속성 → 구성속성 → 디버깅 → 환경

항목에 환경변수로 설정

예) PATH=%PATH%;D:\OJT\2_MISSION\01_securityProject\OpenSSL\bin

D:\OJT\2_MISSION\01_securityProject\OpenSSL\bin 폴더에 openssl 관련 dll 파일이 배치되어있음

 

 


OpenSSL AES 256 암/복호화

 

AES256 KEY 길이 : 256 Bits (32Bytes)

KEY 입력 배열 = unsigned char[32]

입력 받아야함

 

AES256 Block size : 128Bits (16Bytes)

AES는 Block 암호화로 16Bytes 단위로 암호화를 진행함

평문의 길이가 16Bytes를 넘게되면 암호화 운용모드로 16Bytes 단위가 추가로 붙어서 진행된다.

평문의 길이가 18Bytes의 경우 --> 암/복호화 결과 32Bytes로 출력

 

암호 운용 모드 CBC

벡터 (IV) 값이 사용됨

벡터는 평문과 XOR연산을 수행하기 때문에 AES Block size 와 크기가 동일해야함

즉 AES256 CBC 모드 벡터값 길이 : 16Bytes

암호화에 사용되는 벡터값과

복호화에 사용되는 벡터값이 동일해야함

 

OpenSSL AES API

AES 암호화 방식은 2가지가 제공됨

 

1) AES 라이브러리

#include <openssl/aes.h>

AES_set_encrypt_key

AES_set_decrypt_key

AES_cbc_encrypt

  • 마지막 전달 매개변수가 

  • AES_DECRYPT = 복호화

  • AES_ENCRYPT = 암호화

2) EVP 라이브러리 AES 

[EVP란?]

수많은 OpenSSL 암호 API를 하나의 인터페이스로 구성

 

#include <openssl/evp.h>

init, update, final 과정을 거쳐서 암호화

 

[init]

EVP_CIPHER_CTX, EVP_CIPHER_CTX_new, EVP_Encryptinit_ex

암호화 관련 정보를 설정 (암호화 방식, 키 길이, 키 값 등)

 

[update]

EVP_EncryptUpdate

설정한 암호화 방식으로 블럭을 분할해 암호화를 수행

 

[final]

EVP_EncryptFinal

입력한 평문 Text의 크기가 블럭의 배수가 아닐 경우

마지막 block 데이터 끝에 여분의 데이터 바이트를 패딩 처리하여

처리 가능한 크기의 블럭으로 만든 다음 암호화를 수행

 


OpenSSL 해쉬 Hash

 

SHA 256 해쉬

#include <opensssl/sha.h>

 

SHA256_CTX 

  • openssl sha 해쉬 알고리즘 context 선언

SHA256_Init

  • 해쉬 관련 정보를 설정

SHA256_Update

  • SHA256 방식으로 블럭을 분할하여 해쉬를 진행

SHA256_Final

  • 마지막 블럭의 경우 

  • 남는공간을 계산하여 해쉬처리

SHA256_free

 

HMAC 256 해쉬

HMAC 의 Key 설명

HMAC에 사용되는 key 는 길이는 64Bytes 임

키가 64바이트를 초과하면 해시되어(SHA-256 사용) 64바이트 키가 파생

64바이트보다 짧은 경우 64바이트까지 채워짐

 

사용함수

HMAC 함수

#include <openssl/hmac.h>

HMAC( 사용할 hash알고리즘, 키, 키길이, 평문, 평문 길이, 해쉬결과 배열, 해쉬 결과 길이 )

 

EVP 함수

HMAC_Init

HMAC_Update

HMAC_Final

HMAC_CTX_free

 


 

 

반응형

'보안' 카테고리의 다른 글

DEP(Data Execution Prevention) 이란?  (0) 2021.08.27
ASLR 이란?  (0) 2021.08.27
해쉬 (HASH)  (0) 2021.02.23
보안  (0) 2021.02.23
대칭키와 비대칭키란?  (0) 2021.02.19