dev

CryotoPP Example

디클냥 2025. 5. 19. 12:06

CryptoPP

기존 작성한 내용(5.6 버전)의 최신화(8.5 버전) : 빌드 이슈

Package 설치

  • vcpkg 사용 : 8.5.0
$ ./vcpkg install cryptopp
Computing installation plan...
The following packages will be built and installed:
    cryptopp[core]:arm64-osx -> 8.5.0
...
The package cryptopp:arm64-osx provides CMake targets:

    find_package(cryptopp CONFIG REQUIRED)
    target_link_libraries(main PRIVATE cryptopp-static)
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(main)
set(CMAKE_CXX_STANDARD 17)

add_executable(main main.cpp)
target_compile_options(main PRIVATE -Wall -O2)

find_package(cryptopp CONFIG REQUIRED)
target_link_libraries(main PRIVATE cryptopp-static)

Build

$ mkdir build && cd build
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=<PATH>/vcpkg/scripts/buildsystems/vcpkg.cmake

$ build 

Example

  • 기본 Flow
- Encryption : StringSource -> StreamTransformationFilter(Encryptor) -> Base64Encoder(StringSink)
- Decryption : StringSource -> Base64Decoder -> StreamTransformationFilter(Decryptor, StringSink)

과거 버전과의 이슈

#include <iostream>
#include <algorithm>
using namespace std;

#include <cryptopp/cryptlib.h>
#include <cryptopp/base64.h>
#include <cryptopp/aes.h>
#include <cryptopp/seed.h>
#include <cryptopp/des.h>
#include <cryptopp/modes.h>
#include <cryptopp/filters.h>

template <class EncryptorType>
std::string Encrypt(EncryptorType &encryptor, const std::string &PlainText) 
{
    std::string CipherText;
    CryptoPP::StringSource(PlainText, true,
        new CryptoPP::StreamTransformationFilter(
            encryptor, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(CipherText), false) /* default padding */
        )
    );
    return CipherText;
}

template <class DecryptorType>
std::string Decrypt(DecryptorType &decryptor, const std::string &EncText) 
{
    std::string PlainText;
    CryptoPP::StringSource(EncText, true,
        new CryptoPP::Base64Decoder(
            new CryptoPP::StreamTransformationFilter(
                decryptor, new CryptoPP::StringSink(PlainText)
            )
        )
    );
    return PlainText;
}

int main()
{
    using namespace std;
    using AES = CryptoPP::AES;

    CryptoPP::SecByteBlock KEY(AES::DEFAULT_KEYLENGTH);
    CryptoPP::SecByteBlock IV(AES::DEFAULT_KEYLENGTH);

    // 임의 값 초기화 
    for (auto &c : KEY) c = 0;
    for (auto &c : IV) c = 0;

    CryptoPP::CBC_Mode<AES>::Encryption Encryptor { KEY, KEY.size(), IV };
    CryptoPP::CBC_Mode<AES>::Decryption Decryptor { KEY, KEY.size(), IV };

    try {
        string sText = "Plain Text";
        string sEnc, sDec;

        sEnc = Encrypt(Encryptor, sText);
        cout << sText << " -> " << sEnc << endl;

        sDec = Decrypt(Decryptor, sEnc);
        cout << sEnc << " -> " << sDec << endl;    
    }
    catch (exception &ex) {
        cerr << ex.what() << endl;
    }

    return 0;
}
$ ./main
Plain Text -> MtiafY0csWZJZzsRNfE8cA==
MtiafY0csWZJZzsRNfE8cA== -> Plain Text

'dev' 카테고리의 다른 글

Vcpkg Basic  (0) 2025.05.19
C++ REST SDK(cpprestsdk) Sample  (0) 2025.05.19
C++ Lambda 표현식  (0) 2025.05.18
SQLAlchemy Query Basic (w/Flask)  (0) 2025.05.18
Golang GC  (1) 2025.05.18