2021년 신규 작성
--
DES가장 오래되고, 세계적으로 가장 널리 사용되는 고전적 암호화 알고리즘이다. 파일이나 패킷을 암호화할 때 많이 사용된다. 하지만, 64비트 입력 블록과 56비트 짧은 비밀키를 사용하기 때문에, 더 이상 안전하지 않다고 간주하고 있다. 그러나, 국가 기밀을 다룰 정도로 극히 중요한 보안이 아니라면, 여전히 가장 널리 사용되는 알고리즘이다.3-DESDES를 3번 반복해서 암호화한다. 보안성이 향상되고, 그 만큼 성능은 떨어진다.AES미국 NIST에서 공모해서 표준화한 새로운 알고리즘이다. 128비트 입력 블록을 도입함으로써, 보안성을 향상했으며, 최근에 세계적으로 널리 사용되는 알고리즘이다.SEEDKISA 주관으로 ETRI와 함께 국내에서 만들어진 알고리즘이다. 역시, 128비트 입력 블록을 사용하고 있고, 국제 표준에 부합하는 알고리즘이다.
ECB(Electronic codebook) : 평문을 일정 크기의 블록으로 나누어서 처리, 각 블록은 동일한 키로 암호CBC(Cipher-block chaining) : 평문 블록과 바로 직전의 암호블록을 XOR한 것. 첫번째 암호 블록을 위해 초기 벡터 IV 값 사용기타..PCBC(Propagating cipher-block chaining)CFB(Cipher feedback)OFB(Output feedback)CTR(Counter)
enum BlockPaddingScheme{NO_PADDING, ZEROS_PADDING, PKCS_PADDING, ONE_AND_ZEROS_PADDING, DEFAULT_PADDING};NO_PADDING : 패딩 없음ZEROS_PADDING : NULL(0) 으로 패딩PKCS_PADDING : 패딩되는 바이트의 수의 같은 값으로 모두 패딩ONE_AND_ZEROS_PADDING : ONE_AND_ZEROS_PADDING to use 0x80 instead 0x01 as paddingDEFAULT_PADDING : DEFAULT_PADDING means PKCS_PADDINGif c.MandatoryBlockSize() > 1 && c.MinLastBlockSize() == 0 (e.g. ECB or CBC mode), otherwise NO_PADDING (OFB, CFB, CTR, CBC-CTS modes)
#include <iostream> using namespace std; //#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 // Crypto++ Includes #include "cryptlib.h" #include "Base64.h" #include "aes.h" #include "seed.h" #include "des.h" #include "modes.h" #include "filters.h" #pragma comment(lib, "cryptlib") template <class TyMode> std::string Encrypt(TyMode &Encryptor, const std::string &PlainText) { std::string EncodedText; try { CryptoPP::StringSource(PlainText, true, new CryptoPP::StreamTransformationFilter(Encryptor, new CryptoPP::Base64Encoder( new CryptoPP::StringSink(EncodedText), false ), CryptoPP::BlockPaddingSchemeDef::ZEROS_PADDING ) ); } catch (...) {} return EncodedText; } template <class TyMode> std::string Decrypt(TyMode &Decryptor, const std::string &EncodedText) { std::string RecoveredText; try { CryptoPP::StringSource(EncodedText, true, new CryptoPP::Base64Decoder( new CryptoPP::StreamTransformationFilter(Decryptor, new CryptoPP::StringSink(RecoveredText), CryptoPP::BlockPaddingSchemeDef::ZEROS_PADDING ) ) ); } catch (...) {} return RecoveredText; } template <class Ty> std::string CBC_Encrypt(byte *KEY, byte *IV, const std::string &PlainText) { typename CryptoPP::CBC_Mode<Ty>::Encryption Encryptor(KEY, Ty::DEFAULT_KEYLENGTH, IV); return Encrypt(Encryptor, PlainText); } template <class Ty> std::string CBC_Decrypt(byte *KEY, byte *IV, const std::string &PlainText) { typename CryptoPP::CBC_Mode<Ty>::Decryption Decryptor(KEY, Ty::DEFAULT_KEYLENGTH, IV); return Decrypt(Decryptor, PlainText); } template <class Ty> std::string ECB_Encrypt(byte *KEY, const std::string &PlainText) { typename CryptoPP::ECB_Mode<Ty>::Encryption Encryptor(KEY, Ty::DEFAULT_KEYLENGTH); return Encrypt(Encryptor, PlainText); } template <class Ty> std::string ECB_Decrypt(byte *KEY, const std::string &PlainText) { typename CryptoPP::ECB_Mode<Ty>::Decryption Decryptor(KEY, Ty::DEFAULT_KEYLENGTH); return Decrypt(Decryptor, PlainText); } template <class CryptoType> void Test() { using namespace std; const std::string sText = "Plain Text"; std::string sEnc, sDec; byte KEY[CryptoType::DEFAULT_KEYLENGTH] = { 0, }; byte IV[CryptoType::BLOCKSIZE] = { 0x01, }; // CBC 모드 sEnc = CBC_Encrypt<CryptoType>(KEY, IV, sText); sDec = CBC_Decrypt<CryptoType>(KEY, IV, sEnc); cout << CryptoType::StaticAlgorithmName() << " : " << "CBC_MODE" << endl; cout << sText << "\n -> " << sEnc << "\n -> " << sDec << endl; // ECB 모드 sEnc = ECB_Encrypt<CryptoType>(KEY, sText); sDec = ECB_Decrypt<CryptoType>(KEY, sEnc); cout << CryptoType::StaticAlgorithmName() << " : " << "ECB_MODE" << endl; cout << sText << "\n -> " << sEnc << "\n -> " << sDec << endl; cout << endl; } int main() { using namespace std; // SEED Test<CryptoPP::SEED>(); // AES Test<CryptoPP::AES>(); // DES Test<CryptoPP::DES>(); return 0; }
'Dev > Encryption' 카테고리의 다른 글
SHA1 해쉬함수, boost 라이브러리로 구현 (0) | 2014.10.22 |
---|---|
디피-헬만 키 교환, C++ 예제 (0) | 2014.10.17 |
디피-헬만 키 교환 (0) | 2014.10.16 |
SSL 키 교환 방식 (0) | 2014.10.15 |
해쉬 함수 SHA1CryptoServiceProvider, SHA1Managed 차이 (0) | 2014.09.26 |