[c++] C++에서의 암호화 복호화 프로세스
C++은 데이터를 안전하게 암호화하고 복호화하는 데 사용할 수 있는 강력한 암호화 라이브러리와 도구를 제공합니다. 여기에서는 C++에서의 암호화 및 복호화 프로세스에 대해 알아보겠습니다.
1. 대칭 키 암호화
대칭 키 암호화는 동일한 키를 사용하여 메시지를 암호화하고 복호화하는 방법입니다. C++에서는 Crypto++
나 Botan
과 같은 라이브러리를 사용하여 대칭 키 알고리즘(예: AES, DES)을 구현할 수 있습니다.
아래는 Crypto++
를 사용하여 AES 알고리즘으로 메시지를 암호화하고 복호화하는 예제입니다.
// Includes
#include <iostream>
#include <crypto++/aes.h>
#include <crypto++/modes.h>
#include <crypto++/filters.h>
#include <crypto++/osrng.h>
// 암호화 함수
std::string encryptMessage(const std::string& message, const std::string& key)
{
CryptoPP::AES::Encryption encryption((byte*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(encryption, (byte*)key.c_str());
std::string ciphertext;
CryptoPP::StringSource encryptor(message, true, new CryptoPP::StreamTransformationFilter(cbcEncryption, new CryptoPP::StringSink(ciphertext)));
return ciphertext;
}
// 복호화 함수
std::string decryptMessage(const std::string& ciphertext, const std::string& key)
{
CryptoPP::AES::Decryption decryption((byte*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(decryption, (byte*)key.c_str());
std::string decryptedtext;
CryptoPP::StringSource decryptor(ciphertext, true, new CryptoPP::StreamTransformationFilter(cbcDecryption, new CryptoPP::StringSink(decryptedtext)));
return decryptedtext;
}
int main()
{
std::string key = "my_secret_key123";
std::string message = "Hello, world!";
std::string encryptedMessage = encryptMessage(message, key);
std::cout << "Encrypted message: " << encryptedMessage << std::endl;
std::string decryptedMessage = decryptMessage(encryptedMessage, key);
std::cout << "Decrypted message: " << decryptedMessage << std::endl;
return 0;
}
2. 비대칭 키 암호화
비대칭 키 암호화는 공개키와 개인키를 사용하여 메시지를 암호화하고 복호화하는 방법입니다. C++에서는 OpenSSL
을 사용하여 RSA, DSA, ECC 등의 알고리즘을 구현할 수 있습니다.
아래는 OpenSSL
을 사용하여 RSA 알고리즘으로 메시지를 암호화하고 복호화하는 예제입니다.
// Includes
#include <iostream>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
// 암호화 함수
std::string encryptMessage(const std::string& plaintext, RSA* publicKey)
{
int encryptedMessageLength = RSA_size(publicKey);
unsigned char* encryptedMessage = new unsigned char[encryptedMessageLength];
int result = RSA_public_encrypt(plaintext.length(), (const unsigned char*)plaintext.c_str(), encryptedMessage, publicKey, RSA_PKCS1_PADDING);
if (result == -1)
{
ERR_load_crypto_strings();
std::cerr << "Error during encryption: " << ERR_error_string(ERR_get_error(), nullptr) << std::endl;
exit(1);
}
std::string encryptedText = std::string((char*)encryptedMessage, result);
delete[] encryptedMessage;
return encryptedText;
}
// 복호화 함수
std::string decryptMessage(const std::string& encryptedText, RSA* privateKey)
{
int decryptedMessageLength = RSA_size(privateKey);
unsigned char* decryptedMessage = new unsigned char[decryptedMessageLength];
int result = RSA_private_decrypt(encryptedText.length(), (const unsigned char*)encryptedText.c_str(), decryptedMessage, privateKey, RSA_PKCS1_PADDING);
if (result == -1)
{
ERR_load_crypto_strings();
std::cerr << "Error during decryption: " << ERR_error_string(ERR_get_error(), nullptr) << std::endl;
exit(1);
}
std::string decryptedText = std::string((char*)decryptedMessage, result);
delete[] decryptedMessage;
return decryptedText;
}
int main()
{
// 키 쌍 생성 (공개키, 개인키)
RSA* publicKey;
RSA* privateKey;
// ...
std::string plaintext = "Hello, world!";
std::string encryptedMessage = encryptMessage(plaintext, publicKey);
std::cout << "Encrypted message: " << encryptedMessage << std::endl;
std::string decryptedMessage = decryptMessage(encryptedMessage, privateKey);
std::cout << "Decrypted message: " << decryptedMessage << std::endl;
RSA_free(publicKey);
RSA_free(privateKey);
return 0;
}
3. 결론
C++에서는 강력한 암호화 알고리즘들을 구현하기 위한 다양한 라이브러리와 도구들이 제공됩니다. 이러한 라이브러리 및 도구를 활용하여 데이터를 안전하게 암호화하고 복호화할 수 있습니다.
위 예제에서는 Crypto++
및 OpenSSL
을 사용하여 대칭 키 및 비대칭 키 암호화를 소개하였으며, 실제 프로덕션 환경에서는 보안을 위해 더 많은 주의가 필요합니다. 암호화 키의 안전한 보관, 키 교환 및 관리 등에도 주의를 기울여야 합니다.
더 많은 정보를 얻고 싶다면 Crypto++ 공식 웹사이트나 OpenSSL 공식 웹사이트를 방문해보시기 바랍니다.