2017-11-04 8 views
1

C++로 자체 암호화 라이브러리를 작성하려고하는데, OOP 측의 문제가 있습니다.구조체 암호화 방법

최적의 모듈성과 재사용 성을 제공하면서 라이브러리를 사용하는 사람이라면 누구나 쉽게 사용할 수 있도록 라이브러리를 구조화하려고합니다.

내가 이미 (128, 192 및 256) AES를 구현했습니다 내가 제대로 데이터를 암호화하고 해독 할 수있어 난 지금

(I는 NIST의 ECB 테스트 벡터를 사용하는 일부 단위 테스트를 썼다) AES가 사슬로 묶인 사안에서 일하도록하기. (그래서 적절한 ECB, CBC, CFB, OFB, ...)

나는 "최종 사용자"를 위해 사용하기 쉬운 방식으로 내 라이브러리를 구조화하는 방법을 놓치고 있습니다. 대부분 다른 프로젝트에서 나처럼).

는 지금이 내가 그것을 설정 한 방법입니다

내가 정적 메서드 createBlockCipher는,이 방법은 문자열로 블록 암호의 이름으로 소요가 있고 BlockCipher 객체를 반환하는 CipherFactory 클래스가 단일 블록의 암호화 및 해독에 사용될 수 있습니다.

저는 기본적으로 구현 한 모든 블록 암호에 대해 슈퍼 클래스 인 BlockCipher 클래스를 가지고 있습니다. (지금은 그냥 AES로, 아마도 좀 더 길을 추가 할 것입니다.) BlockCipher 클래스는 blocksize, keysize 및 알고리즘 이름을 가져 오기위한 몇 가지 getter를 제공합니다. 또한이 가상의 수퍼 클래스로 누군가를 암호화하려고 시도하는 것을 막기 위해 NotImplemented을 호출 할 때 가상 암호화 및 암호 해독 방법을 사용합니다.

그럼 BlockCipher 클래스에서 상속 받고 해당 암호화 및 암호 해독 방법을 구현하는 AES 클래스가 있습니다.

필자가 찾고있는 것은 UML 클래스 다이어그램, 디자인 패턴 또는 우아한 방법으로 연결 모드를 구현할 수있는 일반적인 조언입니다.

나는 이미 Crypto ++에 대해 살펴 봤지만 문서 및 코드는 다소 이상한 것처럼 보입니다 (How 아이러니!).

면책 조항 : (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Common_modes 크립토 부서에서 그 지식이 아니지만 OOAD와 좋은 당신의 사람들을 위해) :

나는 DIY-암호가 (모든 경우되지 않음) 나쁜 생각 가장 것을 알고 시간이 지남에, 나는 그것으로 심각한 것을 암호화 할 계획이 없다. 이것은 단지 개인적인 프로젝트 일 뿐이다.

+0

팩토리를 통해 기본 'BlockCipher' 객체를 생성하는 사람은 누구입니까? 그냥 내주지 않을 수 없니? –

+0

당신은 아주 좋은 지적이 있습니다. 나는 그곳에 방법을 넣을 것이라고 생각했다.나는 또한 어떻게 든 그 안에'BlockCipher' 객체가 default-construct를 얻었을 때 여전히 거기에 넣을 것이라고 생각했습니다. (기본적으로, 나는이 가짜 객체를 사용하여 상황을 악화시키는 것을 막기 위해 노력하고 있습니다.) 공장의 알고리즘 이름을 식별하기위한'if-else if-else if -...' 문도 있습니다. 문이 마지막 가능성 (일반 'else')까지 떨어지면 BlockCipher 객체를 반환하지만 대신 예외를 throw해야한다고 생각하십니까? – shmoo6000

+0

기존 구현의 큰 문제는 문서가 부족하고 특히 기본값이 부족하다는 것입니다. 합리적으로 좋은 예는 [RNCryptor-Spec] (https://github.com/RNCryptor/RNCryptor-Spec)을 참조하십시오. 버전, 선택적 암호 확장, IV 처리 및 인증에 유의하십시오. 라이브러리를 기존 구현과 함께 사용할 수 있도록 암호 확장, IV 처리 및 인증을 선택 사항으로 사용하는 것이 좋습니다. CBC, ECB 및 CTR은 필수적이며 앞으로는 GCM이 필요하지만 수학을 구현하는 것은 쉽지 않습니다. – zaph

답변

1

이는 실내 장식 디자인 패턴의 변형처럼 들립니다.

각 사이퍼 클래스의 생성자를 const BlockCipher&의 인스턴스를 인수로 삼아 생성 할 인스턴스를 체인의 다음 사이퍼로 저장할 수 있습니다.

CipherFactory에는 CreateBlockCypherChain() 메서드가있을 수 있습니다.이 메서드는 문자열 이름 배열을 사용하고 해당 큐퍼에서 생성 된 체인을 반환합니다.