'Dev > C++' 카테고리의 다른 글
boost 설치 (0) | 2013.11.20 |
---|---|
boost::asio 클라이언트 소켓 (timeout 기능) (0) | 2010.10.14 |
C++0x, RValue Reference (0) | 2009.05.27 |
C++0x Lambda (0) | 2009.05.20 |
C++0x 지원 컴파일러 목록 (0) | 2009.05.20 |
boost 설치 (0) | 2013.11.20 |
---|---|
boost::asio 클라이언트 소켓 (timeout 기능) (0) | 2010.10.14 |
C++0x, RValue Reference (0) | 2009.05.27 |
C++0x Lambda (0) | 2009.05.20 |
C++0x 지원 컴파일러 목록 (0) | 2009.05.20 |
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; }
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 |
패키지 활성화 | JIT 활성화 | 멤버변수 상태 유지 | 전역변수 상태 |
1. 서버 응용 프로그램 | 활성 | 유지 않함 | 유지 (활성화 개체 단위) |
2. 서버 응용 프로그램 | 비 활성 | 유지 | 유지 (활성화 개체 단위) |
3. 라이브러리 응용 프로그램 | 활성 | 유지 않함 | 유지 (세션 단위) |
4. 라이브러리 응용 프로그램 | 비 활성 | 유지 | 유지 (세션 단위) |
MS MTC 서비스 설정 (0) | 2012.04.04 |
---|---|
.svn 폴더 삭제 (0) | 2011.03.25 |
Redmine 세팅 (0) | 2009.09.12 |
ATL Com Project VC++ 6 에서 VC++ 8 변환(업그레이드) (0) | 2009.03.27 |
유니코드(UNICODE), C++ (0) | 2008.10.16 |
.svn 폴더 삭제 (0) | 2011.03.25 |
---|---|
COM+ 패키지 활성화별 세션 상태 정리 (0) | 2009.09.22 |
ATL Com Project VC++ 6 에서 VC++ 8 변환(업그레이드) (0) | 2009.03.27 |
유니코드(UNICODE), C++ (0) | 2008.10.16 |
VARIANT 에서 객체 추출하기 (0) | 2008.09.09 |
twitter 잡담 (0) | 2009.08.15 |
---|---|
근황, 단상 - 2009.08.08 (0) | 2009.08.08 |
생각의 정리.. (0) | 2008.12.17 |
회의를 좋아하는 매니저의 특징 (0) | 2008.09.17 |
팀장 딜레마.. (0) | 2007.07.02 |
요즘 IT 관심사 - 2009.09.02 (0) | 2009.09.02 |
---|---|
근황, 단상 - 2009.08.08 (0) | 2009.08.08 |
생각의 정리.. (0) | 2008.12.17 |
회의를 좋아하는 매니저의 특징 (0) | 2008.09.17 |
팀장 딜레마.. (0) | 2007.07.02 |
LUCENE.NET 검색엔진 (0) | 2013.01.02 |
---|---|
C# Web Service -> REST (0) | 2009.08.09 |
Integrating WCF Services with COM+ (0) | 2008.09.03 |
Interop 응용 프로그램 배포 (0) | 2007.10.05 |
RCW, CCW (0) | 2007.10.04 |
하지만 Basic Type 을 쓰면 Strong한 타입 체킹을 할 수 없다는 단점이 있긴하다..<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
LUCENE.NET 검색엔진 (0) | 2013.01.02 |
---|---|
SerializeToXML - C# (0) | 2009.08.10 |
Integrating WCF Services with COM+ (0) | 2008.09.03 |
Interop 응용 프로그램 배포 (0) | 2007.10.05 |
RCW, CCW (0) | 2007.10.04 |
The Task Scheduler provides APIs for the following developers:
The Task Scheduler requires the following operating systems.
요즘 IT 관심사 - 2009.09.02 (0) | 2009.09.02 |
---|---|
twitter 잡담 (0) | 2009.08.15 |
생각의 정리.. (0) | 2008.12.17 |
회의를 좋아하는 매니저의 특징 (0) | 2008.09.17 |
팀장 딜레마.. (0) | 2007.07.02 |
boost::asio 클라이언트 소켓 (timeout 기능) (0) | 2010.10.14 |
---|---|
이미지 변환 모듈 (모바일용, GDI+) (0) | 2010.06.22 |
C++0x Lambda (0) | 2009.05.20 |
C++0x 지원 컴파일러 목록 (0) | 2009.05.20 |
C++ Refactoring (0) | 2009.04.14 |
Re binders: Okay, I give! I’ll use a better example next time.
(no name) asked: "How are local variables captured?" You have to specify whether it’s by copy or by reference. So this example is illegal because it tries to use a local variable:
int numWidgets = 0;
for_each( v.begin(), v.end(), []( Widget& w )
{
++numWidgets; // error, numWidgets is not in scope
} );
If you want to update numWidgets directly, capture it by reference:
for_each( v.begin(), v.end(), [&numWidgets]( Widget& w )
{
++numWidgets; // increments original numWidgets
} );
// numWidgets == v.size() here
Or use the shorthand [&] to take all captured variables implicitly by reference:
for_each( v.begin(), v.end(), [&]( Widget& w )
{
++numWidgets; // increments original numWidgets
} );
// numWidgets == v.size() here
What if you want a local copy? You say to pass it by value, but for safety reasons the current proposal says you get a read-only copy that you can’t modify:
for_each( v.begin(), v.end(), [numWidgets]( Widget& w )
{
int i = numWidgets; // ok
++i;
// "++numWidgets;" would be an error
} );
// numWidgets == 0 here
Or use the shorthand [=] to take all captured variables implicitly by copy:
for_each( v.begin(), v.end(), [=]( Widget& w )
{
int i = numWidgets; // ok
++i;
// "++numWidgets;" would be an error
} );
// numWidgets == 0 here
Similarly, for the question: "What will happen in the following case:"
int flag = 0;
mypool.run( [] { flag = 1; } );
cout << flag << endl;
이미지 변환 모듈 (모바일용, GDI+) (0) | 2010.06.22 |
---|---|
C++0x, RValue Reference (0) | 2009.05.27 |
C++0x 지원 컴파일러 목록 (0) | 2009.05.20 |
C++ Refactoring (0) | 2009.04.14 |
An Overview of the Coming C++ (C++0x) Standard (0) | 2008.12.29 |
C++0x, RValue Reference (0) | 2009.05.27 |
---|---|
C++0x Lambda (0) | 2009.05.20 |
C++ Refactoring (0) | 2009.04.14 |
An Overview of the Coming C++ (C++0x) Standard (0) | 2008.12.29 |
asio C++ library (0) | 2008.08.22 |