Crypto++ 암호화 오픈 라이브러리

 

여러가지 암호화 알고리즘을 쉽게 사용할 수 있는 CryptoPP(Crypto++) 라이브러리에 대해 알아봅시다.


암호화 알고리즘 및 컴파일러 지원목록 (8.9 버전 기준)

 

컴파일러

- Visual Studio 2003 - 2022
GCC 3.3 - 13.1
Apple Clang 4.3 - 12.0
LLVM Clang 2.9 - 14.0
C++ Builder 2015
Intel C++ Compiler 9 - 16.0
Sun Studio 12u1 - 12.7
IBM XL C/C++ 10.0 - 14.0

 

암호화 알고리즘

인증된 암호화 체계 GCM, CCM, EAX, ChaCha20Poly1305, XChaCha20Poly1305
고속 스트림 암호 ChaCha (8/12/20), ChaCha (IETF) HC (128/256), Panama, Rabbit (128/256), Sosemanuk, Salsa20 (8/12/20), XChaCha (8/12/20), XSalsa20
AES 및 AES 후보 AES (Rijndael), RC6, MARS, Twofish, Serpent, CAST-256
다른 블록 암호들 ARIA, Blowfish, Camellia, CHAM, HIGHT, IDEA, Kalyna (128/256/512), LEA, SEED, RC5, SHACAL-2, SIMECK, SIMON (64/128), Skipjack, SPECK (64/128), Simeck, SM4,Threefish (256/512/1024), Triple-DES (DES-EDE2 and DES-EDE3), TEA, XTEA
블록 암호 동작 모드 ECB, CBC, CBC ciphertext stealing (CTS), CFB, OFB, counter mode (CTR), XTS
메시지 인증 코드 BLAKE2b, BLAKE2s, CMAC, CBC-MAC, DMAC, GMAC (GCM), HMAC, Poly1305, SipHash, Two-Track-MAC, VMAC
해시 함수 BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL
공개키 암호방법 RSA, DSA, Determinsitic DSA (RFC 6979), ElGamal, Nyberg-Rueppel (NR), Rabin-Williams (RW), EC-based German Digital Signature (ECGDSA), LUC, LUCELG, DLIES (variants of DHAES), ESIGN
공개 키 시스템에 대한 패딩 체계 PKCS#1 v2.0, OAEP, PSS, PSSR, IEEE P1363 EMSA2 and EMSA5
주요 합의 계획 Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), Hashed MQV (HMQV), Fully Hashed MQV (FHMQV), LUCDIF, XTR-DH
타원 곡선 암호법 ECDSA, Determinsitic ECDSA (RFC 6979), ed25519, ECGDSA, ECNR, ECIES, x25519, ECDH, ECMQV
하위 호환성 및 안전하지 않거나 오래된 알고리즘 MD2, MD4, MD5, Panama Hash, DES, ARC4, SEAL 3.0, WAKE-OFB, DESX (DES-XEX3), RC2, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square
번외 16진수, base-32, base-64, URL safe base-64, 32비트 CRC, CRC-C, Adler32 checksum 등

 

좀 더 자세한 내용은 아래 링크에서 확인하시기 바랍니다.

https://cryptopp.com/index.html

 

Crypto++ Library 8.9 | Free C++ Class Library of Cryptographic Schemes

hash functions BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL

cryptopp.com


라이브러리 소스파일 준비

 

https://cryptopp.com/downloads.html

 

Crypto++ Library | All Downloads

The downloads page provides all downloads of the Crypto++ library. The earliest download available is Crypto++ 2.3 from January 1998. Crypto++ 1.0 was released in June 1995, but the download is no longer available. The hashes provided with a download were

cryptopp.com

 

홈페이지에서 cryptopp890.zip 파일을 다운받습니다.


Windows 버전

 

1. 라이브러리 빌드하기

 

압축해제를 하고 cryptest.sin 파일을 엽니다.

 

정적 라이브러리를 사용할꺼면 cryptlib, 동적 라이브러리를 사용할꺼면 cryptdll 프로젝트를 시작프로젝트로 설정후 빌드합니다.

 

저는 정적 라이브러리로 빌드하여 위와같이 cryptlib.lib 파일이 생성되었습니다.

 

2. 라이브러리 사용하기

 

이제 라이브러리 테스트를 해볼 프로젝트를 만들어 봅시다.

프로젝트를 만들었으면 아래와 같이 프로젝트 속성을 설정해 줍니다.

 

C/C++ -> 일반 -> 추가 포함 디렉터리: cryptopp 라이브러리 헤더파일이 있는곳으로 설정합니다.

 

 

C/C++ -> 코드 생성 -> 런타임 라이브러리를 다중 스레드(/MT)로 변경해줍니다.

 

 

링커 -> 일반 -> 추가 라이브러리 디렉터리를 Crypto++ 라이브러리를 빌드해서 생긴 lib파일이 있는곳으로 설정합니다.

 

 

링커 -> 입력 -> 추가 종속성에 lib파일 정보를 설정합니다.

 

#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

typedef unsigned char byte;
typedef unsigned long long word64;

#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

void main()
{
	string stringTest = "Ruru TestString";
	string encTest, decTest;

	/* 인코딩 시작 */
	Base64Encoder encoder;

	encoder.Put((const byte*)stringTest.data(), stringTest.size());
	encoder.MessageEnd();

	word64 encSize = encoder.MaxRetrievable();
	if (encSize)
	{
		encTest.resize(encSize);
		encoder.Get((byte*)&encTest[0], encTest.size());
	}

	cout << "Base64 Encode: " << encTest << endl;

	/* 디코딩 시작 */
	Base64Decoder decoder;

	decoder.Put((byte*)encTest.data(), encTest.size());
	decoder.MessageEnd();

	word64 decSize = decoder.MaxRetrievable();
	if (decSize && decSize <= SIZE_MAX)
	{
		decTest.resize(decSize);
		decoder.Get((byte*)&decTest[0], decTest.size());
	}

	cout << "Base64 Decode: " << decTest << endl;
}

 

다음은 문자열을 Base64 인코딩, 디코딩 하는 코드입니다. Crypto++ 라이브러리의 네임스페이스는 CryptoPP를 사용합니다. 

 

 

빌드를 하면 정상적으로 동작하는것을 확인할 수 있습니다.


Linux 버전

 

리눅스는 윈도우와 달리 좀더 간편하게 라이브러리를 빌드하고 사용할 수 할수있습니다.

 

1. 라이브러리 빌드하기

 

# 압축 해제 #
unzip cryptopp890.zip -d ./cryptopp890

# 압축 해제 폴더로 이동 #
cd cryptopp890

# 정적 라이브러리, 동적 라이브러리, 테스트파일 빌드 #
# 방법 1 #
make static dynamic cryptest.exe

# 방법 2 #
make libcryptopp.a libcryptopp.so cryptest.exe

# 빌드 확인 #
ls *.so *.a *.exe

 

2. 라이브러리 사용하기

 

이제 라이브러리가 준비되었으니 테스트파일을 만들어 테스트 해봅시다.

# cryptopp890 폴더에서 뒤로가기 #
cd ..

# 테스트용 cpp파일 생성 #
vi CryptoTest.cpp

 

#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

typedef unsigned char byte;
typedef unsigned long long word64;

#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

int main()
{
	string stringTest = "Ruru TestString";
	string encTest, decTest;

	/* 인코딩 시작 */
	Base64Encoder encoder;

	encoder.Put((const byte*)stringTest.data(), stringTest.size());
	encoder.MessageEnd();

	word64 encSize = encoder.MaxRetrievable();
	if (encSize)
	{
		encTest.resize(encSize);
		encoder.Get((byte*)&encTest[0], encTest.size());
	}

	cout << "Base64 Encode: " << encTest << endl;

	/* 디코딩 시작 */
	Base64Decoder decoder;

	decoder.Put((byte*)encTest.data(), encTest.size());
	decoder.MessageEnd();

	word64 decSize = decoder.MaxRetrievable();
	if (decSize && decSize <= SIZE_MAX)
	{
		decTest.resize(decSize);
		decoder.Get((byte*)&decTest[0], decTest.size());
	}

	cout << "Base64 Decode: " << decTest << endl;
    
    return 0;
}

 

# 테스트용 cpp파일 빌드 #
g++ -DNDEBUG -g3 -O2 -Wall -Wextra -o CryptoTest CryptoTest.cpp -I ./cryptopp890 ./cryptopp890/libcryptopp.a

 

윈도우와 똑같이 문자열을 Base64 인코딩, 디코딩 하는 코드입니다. Crypto++ 라이브러리의 네임스페이스는 CryptoPP를 사용합니다. 

 

빌드를 하면 정상적으로 동작하는것을 확인할 수 있습니다.


마무리

 

지금까지 Crypto++ 암호화 오픈 라이브러리에 대해 알아보았습니다. 추후 라이브러리를 통해 다양하게 암호화 하는 방법도 정리할 예정입니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts