티스토리 뷰
openssl을 이용해서 개발할 일이 있거나 버전 업데이트가 필요할 때마다 까먹어서 메모를 해놓습니다.
ubuntu뿐만 아니라 다른 리눅스도 동일하게 진행하면 됩니다.
1. openssl 파일 가져오기
openssl은 현재 1.1.1 버전과 3버전이 있습니다. 필요한 패키지를 설치하면 됩니다.
(작성일 기준 최신 버전)
저는 기본으로 있던 버전이 1.1.1f라 해당 버전으로 설치하겠습니다.
wget https://www.openssl.org/source/openssl-1.1.1f.tar.gz
2. 압축풀기
tar xvfz openssl-1.1.1f.tar.gz
3. config 실행
openssl 폴더에 들어가면 config 실행파일을 볼 수 있습니다. user에도 권한 줄 수 있게 shared 옵션을 줘서 config를 진행합니다. (굳이 필요없으면 그냥 ./config)
./config shared
4. makefile 실행
openssl 폴더에 Makefile이라고 뭔가 설치를 요구해보이는 녀석이 하나 떡 하니 있습니다. 이 녀석도 설치합니다.
make
make install
위 과정까지 하면 설치가 완료되었습니다.
5. 테스트
예전에 짜놓은 openssl의 bignum 헤더(bn.h)와 확장 유클리드 알고리즘으로 최대공약수 구하는 코드를 돌려보겠습니다.
필요하시면 아래 코드를 사용하시면 됩니다.
#include <stdio.h>
#include <openssl/bn.h>
void printBN(char *msg, BIGNUM * a)
{
/* Use BN_bn2hex(a) for hex string * Use BN_bn2dec(a) for decimal string */
char * number_str = BN_bn2dec(a);
printf("%s %s\n", msg, number_str);
OPENSSL_free(number_str);
}
BIGNUM *euclid1(BIGNUM *a, BIGNUM *b)
{
BIGNUM *t;
while (!BN_is_zero(b)) {
if (BN_cmp(a, b) < 0) {
t = a;
a = b;
b = t;
}
if (!BN_sub(a, a, b)) {
goto err;
}
}
return a;
err:
return NULL;
}
BIGNUM *euclid2(BIGNUM *a, BIGNUM *b)
{
BN_CTX *ctx = BN_CTX_new();
BIGNUM *r = BN_new();
BIGNUM *t;
if (BN_cmp(a, b) < 0) {
t = a;
a = b;
b = t;
}
while (!BN_is_zero(b)) {
if(!BN_mod(r,a,b,ctx)){
goto err;
}
BN_copy(a,b);
BN_copy(b,r);
}
BN_copy(r,a);
if(ctx != NULL) BN_CTX_free(ctx);
return r;
err:
return NULL;
}
int main (int argc, char *argv[])
{
BIGNUM *a = BN_new();
BIGNUM *b = BN_new();
BIGNUM *res;
//BIGNUM *res = BN_new();
if(argc != 3){
printf("usage: mygcd num1 num2");
return -1;
}
BN_dec2bn(&a, argv[1]);
BN_dec2bn(&b, argv[2]);
printBN("a = ", a);
printBN("b = ", b);
res = euclid2(a,b);
printBN("(a,b) = ", res);
if(a != NULL) BN_free(a);
if(b != NULL) BN_free(b);
if(res != NULL) BN_free(res);
return 0;
}
위 코드를 mygcd.c로 저장시키고 lssl lcrypto 옵션을 추가해서 openssl 라이브러리를 이용한 컴파일을 진행합니다.
gcc -o mygcd mygcd.c -lssl -lcrypto
# gcc -o <실행파일 이름> <C코드 이름> -lssl -lcrypto
결과는 다음과 같이 잘 됩니다.
'메모' 카테고리의 다른 글
git 간단 정리 (0) | 2024.01.11 |
---|---|
PS Rust 입출력 (0) | 2023.01.09 |
golang 테스트 간단 정리 (testing, github.com/stretchr/testify) (0) | 2022.02.15 |
golang 문자열 입출력 공백 포함하기 (0) | 2022.02.15 |
golang 입출력 빠르게 (0) | 2022.02.15 |
댓글