비대칭 알고리즘을 이용하여, 사인/검증 하는 API를 OpenSSL 1.0.0부터 쓸 수 있다. 문제는 아직 예쁜 예제가 없다는 것. 그래서 낑낑끙끙 하며 만들어 봤다.
패딩 규칙은 기본값은 PKCS#1이며, 변경하고자 할 때는 EVP_Digest(Sign|Verify)Init 함수 두번째 인자에 EVP_PKEY_CTX*의 주소를 넘겨 EVP_PKEY_CTX*를 받는다. 이것에 EVP_PKEY_CTX_set_rsa_padding 함수(실은 매크로 함수이다)로 세팅할 수 있다.
#include <openssl/rsa.h> #include <openssl/evp.h> #include <iostream> using namespace std; void testSignVerify(void) { EVP_PKEY* pkey(/* 이미 만들어놓은 키 */); char src[] = "Hello, world!"; unsigned char sign[1024] = {0x00}; size_t signlen(sizeof(sign)); do { EVP_MD_CTX md; EVP_MD_CTX_init(&md); if ( EVP_DigestSignInit(&md, nullptr, EVP_sha256(), nullptr, pkey) <= 0 ) { cerr << "EVP_DigestSignInit" << endl; break; } if ( EVP_DigestSignUpdate(&md, src, strlen(src)) <= 0 ) { cerr << "EVP_DigestSignUpdate" << endl; break; } if ( EVP_DigestSignFinal(&md, sign, &signlen) <= 0 ) { cerr << "EVP_DigestSignFinal" << endl; break; } cerr << "Sign: "; PWEnc::encodeHex(cerr, sign, signlen) << endl; EVP_MD_CTX_cleanup(&md); } while (false); do { EVP_MD_CTX md; EVP_MD_CTX_init(&md); if ( EVP_DigestVerifyInit(&md, nullptr, EVP_sha256(), nullptr, pkey) <= 0 ) { cerr << "EVP_DigestVerifyInit" << endl; break; } if ( EVP_DigestVerifyUpdate(&md, src, strlen(src)) <= 0 ) { cerr << "EVP_DigestVerifyUpdate" << endl; break; } if ( EVP_DigestVerifyFinal(&md, sign, signlen) <= 0 ) { cerr << "EVP_DigestVerifyFinal" << endl; break; } cerr << "Verify: "; PWEnc::encodeHex(cerr, sign, signlen) << endl; EVP_MD_CTX_cleanup(&md); } while (false); cerr << endl; }
패딩 규칙은 기본값은 PKCS#1이며, 변경하고자 할 때는 EVP_Digest(Sign|Verify)Init 함수 두번째 인자에 EVP_PKEY_CTX*의 주소를 넘겨 EVP_PKEY_CTX*를 받는다. 이것에 EVP_PKEY_CTX_set_rsa_padding 함수(실은 매크로 함수이다)로 세팅할 수 있다.
/* 생략 ... */ EVP_PKEY_CTX* pkey_ctx(nullptr); EVP_DigestSignInit(&md, &pkey_ctx, EVP_sha256(), nullptr, pkey); EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING); EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, 20); /* 생략 ... */
댓글
댓글 쓰기