OpenSSL 정적 라이브러리 빌드
우선 코드라이트 설치부터 진행하겠습니다. 코드라이트란 우리가 흔히 윈도우 환경에서 Visual Code 처럼 다른 언어를 개발하기위한 IDE입니다. 안드로이드로 따지자면 안드로이드 스튜디오라 생각하면 될 것 같습니다.
이처럼 코드라이트도 멀티 플랫폼을 지원하는 IDE입니다. 우리는 이 Codelite를 이용하여 리눅스 우분투 환경에서 Openssl 개발 환경 및 프로젝트를 구성하고 예제를 실행해보도록 하겠습니다.
우선 아래와 같이 리눅스 쉘에서 명령을 실행하여 코드라이트를 설치합니다.
설치가 정상적으로 완료되었다면 아래와 같이 패키지 설치 목록에 나타납니다.
$ sudo apt-get install codelite make
$ sudo dpkg -l | grep codelite
우선 앞으로 예제를 수행할 프로젝트를 만들도록 하겠습니다.
아래 명령을 실행하여 디렉토리를 만듭니다.
$ mkdir ~/openssl_test
$ cd ~/openssl_test
그리고 이전 포스팅에서 만들었던 openssl 정적라이브러리와 헤더를 앞으로 진행할 프로젝트의 경로로 복사하겠습니다.
아래 명령을 실행하여 라이브러리를 복사합니다.
$ cp /tmp/openssl-1.1.0i/libcrypto.a ~/openssl_test/
$ cp /tmp/openssl-1.1.0i/libssl.a ~/openssl_test/
$ cp -R /tmp/openssl-1.1.0i/include ~/openssl_test/
$ ls
라이브러리를 복사했다면 이제 예제 Codelite 프로젝트를 생성해보겠습니다.
아래 명령을 쉘에서 실행하여 codelite를 실행합니다.
$ codelite
codelite가 실행되면 화면에 있는 "New Workspace" 버튼을 클릭합니다.
그리고 Workspace Name은 openssl_example로 설정하고 Workspace Path는 /home/{사용자이름}/openssl_test 로 설정합니다.
하단의 Create the workspace under a separate directory 체크박스는 체크합니다.
이후 OK버튼을 눌러 생성합니다.
이후 왼쪽에 생성된 oepnssl_example 프로젝트 명에 마우스 오른쪽 버튼을 클릭하여 New -> New Project 를 클릭합니다.
그리고 콘솔의 Simple executable (gcc)를 선택하고 Next 합니다.
그리고 프로젝트명을 example로 설정하고 Next를 선택합니다.
이후 Compiler는 gnu gcc, Debugger는 GNU gdb debugger, Build System은 Default로 설정하고 Finish합니다.
자 이제 F5를 눌러 빌드가 가능하고 Main모듈이 생성되었습니다.
이제 이전 포스팅에서 만들었던 openssl 라이브러리를 이 프로젝트에 링크하도록 하겠습니다.
왼쪽에 만들어진 example 프로젝트를 마우스 우클릭하여 Setting... 메뉴를 클릭합니다.
이후 Compiler 메뉴에서 Include Paths 경로에 우리가 복사한 openssl include 경로를 입력합니다.
앞으로 뭐든지 '.' 즉, 현재 경로 기준은 codelite example 프로젝트 파일이 위치한 곳입니다.
include Paths에는 ".;../../include" 를 입력합니다.
'.' 은 현재 경로에 있는 헤더들을 참고하겠다는 의미입니다.
"../../include" 는 example 프로젝트 파일이 "/home/{사용자명}/openssl_test/openssl_example/example/example.project" 경로에 있고 우리가 복사한 openssl include 경로는 "/home/{사용자명}/openssl_test" 에 있기때문에 상대경로로는 ../../ 입니다.
다음으로 libssl.a와 libcrypto.a 정적 라이브러리를 링크해보겠습니다.
왼쪽 메뉴에서 Linker 메뉴로 들어갑니다.
마찬가지로 라이브러리 경로도 위 include 경로와 동일하기 때문에 ../../을 설정하고 라이브러리 명을 입력합니다.
리눅스에서는 라이브러리 파일명 앞에 붙은 lib를 제외하고 입력합니다.
그리고 예제 실행을 위해 pthread, dl라이브러리도 같이 링크합니다.
그래서 총 "ssl;crypto;pthread;dl" 을 입력합니다.
자 이제 설정이 끝났습니다.
이제 간단하게 openssl 라이브러리가 잘 설정되었는지 아래 코드로 확인해보겠습니다.
메인 코드를 수정하고 Ctrl + F5를 입력하여 빌드 및 실행합니다.
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>
int main() {
// OpenSSL 초기화
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
// SSL 컨텍스트 생성
SSL_CTX* ssl_ctx = SSL_CTX_new(SSLv23_client_method());
if (!ssl_ctx) {
fprintf(stderr, "SSL 컨텍스트 생성 실패\n");
exit(EXIT_FAILURE);
}
// SSL 컨텍스트 제거
SSL_CTX_free(ssl_ctx);
printf("OpenSSL 라이브러리가 성공적으로 링크되었습니다.\n");
return 0;
}
OpenSSL MD5 해시 예제
MD5(Message-Digest Algorithm 5)는 메시지 다이제스트 알고리즘으로, 임의의 길이의 데이터를 입력받아 고정된 길이의 해시 값을 출력하는 알고리즘입니다.
주로 데이터 무결성 확인이나 패스워드 등의 보안적인 목적으로 사용됩니다.
이 예제에서는 C 프로그램에서 OpenSSL 라이브러리를 사용하여 MD5 컨텍스트를 생성하는 방법을 설명합니다.
#include <openssl/md5.h>
int main() {
MD5_CTX md5_ctx;
MD5_Init(&md5_ctx);
// MD5 컨텍스트를 초기화하고 데이터를 입력하기 위한 준비
// 필요한 경우 MD5_Update 함수로 데이터를 추가로 입력할 수 있음
printf("정상 초기화\n");
return 0;
}
이 예제에서는 C 프로그램에서 OpenSSL 라이브러리를 사용하여 MD5 해시를 계산하는 방법을 설명합니다.
#include <stdio.h>
#include <openssl/md5.h>
int main() {
char data[] = "Hello, MD5!";
unsigned char md5_hash[MD5_DIGEST_LENGTH];
MD5(data, sizeof(data) - 1, md5_hash);
printf("MD5 해시 결과: ");
for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", md5_hash[i]);
}
printf("\n");
return 0;
}
이 예제에서는 C 프로그램에서 문자열을 입력받아 OpenSSL 라이브러리를 사용하여 MD5 해시를 계산하는 방법을 설명합니다.
#include <stdio.h>
#include <openssl/md5.h>
int main() {
char input_string[100];
printf("문자열을 입력하세요: ");
fgets(input_string, sizeof(input_string), stdin);
unsigned char md5_hash[MD5_DIGEST_LENGTH];
MD5(input_string, strlen(input_string) - 1, md5_hash);
printf("MD5 해시 결과: ");
for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", md5_hash[i]);
}
printf("\n");
return 0;
}
이 예제에서는 C 프로그램에서 파일을 읽어와 OpenSSL 라이브러리를 활용하여 MD5 해시를 계산하는 방법을 설명합니다.
우선 예제에 사용할 임시 텍스트 파일을 만들어보겠습니다.
쉘에서 아래 명령을 실행합니다.
$ echo "test text file!" > /tmp/test_text1.txt
이후 아래와 같이 코드를 작성하고 실행합니다.
#include <stdio.h>
#include <openssl/md5.h>
int main() {
const char* filename = "/tmp/test_text1.txt";
FILE* file = fopen(filename, "rb");
if (!file) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
MD5_CTX md5_ctx;
MD5_Init(&md5_ctx);
unsigned char buffer[1024];
size_t bytes_read;
while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) != 0) {
MD5_Update(&md5_ctx, buffer, bytes_read);
}
unsigned char md5_hash[MD5_DIGEST_LENGTH];
MD5_Final(md5_hash, &md5_ctx);
fclose(file);
printf("파일 %s의 MD5 해시 결과: ", filename);
for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", md5_hash[i]);
}
printf("\n");
return 0;
}
OpenSSL SHA1 해시 예제
SHA1이란?
SHA1(Secure Hash Algorithm 1)은 데이터 무결성을 확인하기 위해 사용되는 해시 함수로, 임의의 길이의 데이터를 입력받아 160비트의 고정된 길이 해시 값을 출력하는 알고리즘입니다.
데이터의 무결성을 보장하는 데에 주로 사용됩니다.
이 예제에서는 C 프로그램에서 OpenSSL 라이브러리를 사용하여 SHA1 컨텍스트를 생성하는 방법을 설명합니다.
#include <openssl/sha.h>
int main() {
SHA_CTX sha1_ctx;
SHA1_Init(&sha1_ctx);
// SHA1 컨텍스트를 초기화하고 데이터를 입력하기 위한 준비
// 필요한 경우 SHA1_Update 함수로 데이터를 추가로 입력할 수 있음
printf("정상 초기화\n");
return 0;
}
이 예제에서는 C 프로그램에서 OpenSSL 라이브러리를 사용하여 SHA1 해시를 계산하는 방법을 설명합니다.
#include <stdio.h>
#include <openssl/sha.h>
int main() {
char data[] = "Hello, SHA1!";
unsigned char sha1_hash[SHA_DIGEST_LENGTH];
SHA1(data, sizeof(data) - 1, sha1_hash);
printf("SHA1 해시 결과: ");
for (int i = 0; i < SHA_DIGEST_LENGTH; i++) {
printf("%02x", sha1_hash[i]);
}
printf("\n");
return 0;
}
이 예제에서는 C 프로그램에서 문자열을 입력받아 OpenSSL 라이브러리를 사용하여 SHA1 해시를 계산하는 방법을 설명합니다.
#include <stdio.h>
#include <openssl/sha.h>
int main() {
char input_string[100];
printf("문자열을 입력하세요: ");
fgets(input_string, sizeof(input_string), stdin);
unsigned char sha1_hash[SHA_DIGEST_LENGTH];
SHA1(input_string, strlen(input_string) - 1, sha1_hash);
printf("SHA1 해시 결과: ");
for (int i = 0; i < SHA_DIGEST_LENGTH; i++) {
printf("%02x", sha1_hash[i]);
}
printf("\n");
return 0;
}
이 예제에서는 C 프로그램에서 파일을 읽어와 OpenSSL 라이브러리를 활용하여 SHA1 해시를 계산하는 방법을 설명합니다.
#include <stdio.h>
#include <openssl/sha.h>
int main() {
const char* filename = "/tmp/test_text1.txt";
FILE* file = fopen(filename, "rb");
if (!file) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
SHA_CTX sha1_ctx;
SHA1_Init(&sha1_ctx);
unsigned char buffer[1024];
size_t bytes_read;
while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) != 0) {
SHA1_Update(&sha1_ctx, buffer, bytes_read);
}
unsigned char sha1_hash[SHA_DIGEST_LENGTH];
SHA1_Final(sha1_hash, &sha1_ctx);
fclose(file);
printf("파일 %s의 SHA1 해시 결과: ", filename);
for (int i = 0; i < SHA_DIGEST_LENGTH; i++) {
printf("%02x", sha1_hash[i]);
}
printf("\n");
return 0;
}
