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
'Tech' 카테고리의 다른 글
Torch7를 사용하는 cpptorch의 Visual Studio 컴파일 방법 (0) | 2019.07.24 |
---|---|
[OpenSSL] EVP 방식으로 OpenSSL 사용하기 1/2 (0) | 2018.08.09 |
PKCS#5 패딩과 PKCS#7 패딩의 차이점 (0) | 2018.08.06 |
몇가지 Random Number Generation 예제 (0) | 2018.08.06 |
[OpenSSL] AES 암호화 복호화 (0) | 2018.08.05 |