본문 바로가기

Tech

[OpenSSL] EVP 방식으로 OpenSSL 사용하기 2/2

EVP 방식으로 OpenSSL에서 RSA 키를 만들고 이것을 이용하여 사인과 검증을 해보자.

 

 

RSA 만드는 방법

 

	pkctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
	EVP_PKEY_keygen_init(pkctx);
	EVP_PKEY_CTX_set_rsa_keygen_bits(pkctx, 2048);
	EVP_PKEY_keygen(pkctx, &keypair);
	EVP_PKEY_CTX_free(pkctx);

 

키 생성부는 Init - Update - Final 구조로가 없는 것으로 보인다.

 

 

사인하는 방법

 

	mctx = EVP_MD_CTX_new();
	EVP_DigestSignInit(mctx, NULL, EVP_sha256(), NULL, keypair);
	EVP_DigestSignUpdate(mctx, pMsg, strlen(pMsg));
	EVP_DigestSignFinal(mctx, NULL, &siglen);
	sig = (unsigned char *)OPENSSL_malloc(siglen);
	EVP_DigestSignFinal(mctx, sig, &siglen);

 

여기서 눈여겨 봐야 할 부분은 결과를 동적으로 할당하는 방법이다.

Final 코드에서 메시지를 주지 않으면 예측되는 결과 사이즈를 반환하게 되어 있다.

그 값을 받아서 동적 할당하라는 의도로 구현된 API 인 것이다.

할당 후 그 버퍼를 넣어주면 안전하게 최종 결과를 받을 수 있다.

 

 

검증하는 방법

 

	EVP_DigestVerifyInit(mctx, NULL, EVP_sha256(), NULL, keypair);
	EVP_DigestVerifyUpdate(mctx, pMsg, strlen(pMsg));
	result = EVP_DigestVerifyFinal(mctx, sig, siglen);
	if (result == 1)	puts("Sign Verify Success!");
	else				puts("Sign Verify False!");

 

 

검증은 사인한 원본과 사인된 값이 입력이고 맞냐 틀리냐가 출력이다.

 

 

 

키를 만드는 법을 제외하고는 구조가 동일하다.

Init - Update - Final 구조이다.

 

C/C++ 프로그래밍이 그렇지만 주의해야 할 것은 메모리 할당이다.

할당을 해준 항목은 반드시  해제하는 것을 잊지말자.

위의 코드들은 이 구조만 보여주기 위한 것일 뿐 할당과 해제를 적용한 전체소스는 깃허브를 참조하자.

 

https://github.com/tebeknet/TestOpenSSL/blob/master/TestOpenSSL/TestOpenSSL.cpp