C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[4634] [만해] 허걱 이런일이~
만해 [greenuri] 2225 읽음    2002-05-07 20:31
안녕하세요 만해입니다.

어제 그제 밤새면서 만들어 놓은

암호화 프로그램을 날렸습니다 흑흑~

L 드라이브에 저장 시켜 놨는데

깜밖했네요

L 드라이브가 램 디스크 였다는것을

대학원 선배가 제 프로그램을 보고 씨플플을 씨처럼 쓴다고 하시면서

너무 거대화된 클래스를 좀 작은 몇개의 클래스로 나누는게 어떻냐고 말하셔서

그말 그대로 쫙 뜯어 고쳤는데

그렇게 해 놓으니 소스는 4개로 늘어 났지만

각각 소스 파일의 라인수가 300~600 사이로 적어서 보기 좋았는데

흑흑 ~

우얄꼬~

이거 또 쪼개야 하남 쩝~

그런데요 쪼갠 프로그램하고

쪼개기전 프로그램을 같이 테스팅 해 봤는데요

쪼개기전의 프로그램이 더 빠른걸로 나왔어요

이걸 그냥 둬 말어 쩝~

우째야 할까~

여기 클래스 정의 부분만 올릴께요

한번씩 보면서 그냥 답글좀 부탁 드릴께요

쪼개는건 이미 한번 해봐서 다시 하면 한 두어 시간이면 하겠는데

그냥 둘까 ~

소스 올라 갑니다~

//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
#include <string.h>
#include <deque>
#include <vector>
#include <algorithm>
#include <cassert.h>
using namespace std;
//---------------------------------------------------------------------------
#pragma pack(push,1)
typedef deque<bool> bitdeque;
typedef vector<bitdeque> bitmatrix;

typedef union DataByte__u {
struct {
          unsigned short a:1;
          unsigned short b:1;
          unsigned short c:1;
          unsigned short d:1;
          unsigned short e:1;
          unsigned short f:1;
          unsigned short g:1;
          unsigned short h:1;
        }bits;
  struct {
          unsigned char Hi:4;
          unsigned char Lo:4;
          }Nibble;
  unsigned char Data;
}DataByte_u;

typedef union DataWord__u    {
  unsigned char Data[2];
  DataByte_u Bytes[2];
  unsigned short IData;
}    DataWord_u;
//TODO : 16 Bit 자료형을 선언한 부분 2Byte

typedef union Data4Word__u{
    DataWord__u Words[2];
    DataByte_u Bytes[4];
    unsigned char Data[4];
    unsigned int IData;
} Data4Word_u;
//TODO : 32 Bit 자료형을 선언한 부분 4Byte

typedef union Data8Word__u{
    Data4Word_u Word4s[2];
    DataWord__u Words[4];
    DataByte_u Bytes[8];
    unsigned char Data[8];
    unsigned long IData[2];
} Data8Word_u;
//TODO : 64 Bit 자료형을 선언한 부분 8Byte

typedef union Data16Word__u{
    Data8Word_u Word8s[2];
    Data4Word_u Word4s[4];
    DataWord__u Words[8];
    DataByte_u Bytes[16];
    unsigned long IData[4];
    unsigned char Data[16];
} Data16Word_u;
//TODO : 128 Bit 자료형을 선언한 부분 16Byte

typedef union Data32Word__u{
    Data16Word_u Data16Words[2];
    Data8Word_u Data8Words[4];
    Data4Word_u Data4Words[8];
    DataWord__u DataWords[16];
    DataByte_u  Bytes[32];
    unsigned char Data[32];
    unsigned long IData[8];
} Data32Word_u;
//TODO : 128 Bit 자료형을 선언한 부분 16Byte
#pragma pack(pop)
//---------------------------------------------------------------------------
class TCrypt
{
  public :

    TCrypt()
      {
        Source[0] = 0x00;
        Output[0] = 0x00;
        FSBox[0] = 0x00;  // SBox 위치
        FESBox[0] = 0x00; // ESBox 위치
      };
    TCrypt(char* const str)
      {
        TCrypt();
        strcpy(Source,str);
      };
// 암호화 부분
    void Encode ( void );//TODO:암호화 함수
    void SetSourceFile (char* const source ){strcpy(Source,source);}; //TODO : 원문을 입력 하는 함수
    void SetTargetFile (char* const Target){strcpy(Output,Target);};
    bool GetSourceFile ( void ){if ( Source!= NULL ) return true;else return false;};
    bool GetTargetFile ( void ){if ( Output!= NULL ) return true;else return false;};

// 복호화 부분
    void Decode ( void );//TODO : 복호화 함수
    void InitSBox(void);
    void InitESBox(void);
    void SetSBox( char* const SBoxLocation ){strcpy(FSBox,SBoxLocation);};
    void SetESBox( char* const ESBoxLocation ){strcpy(FESBox,ESBoxLocation);};
    void KeyGen ( char const key[16] , int const Len );//TODO: Key 스케쥴링 함수
    bool IsSBoxSet ( void ) {if (FSBox!="") return true; else false;};
    bool IsESBoxSet ( void ) {if (FESBox!="") return true; else false;};

  private :
    char FSBox[80];  // SBox 위치
    char FESBox[80]; // ESBox 위치
    char Source[80]; // 원본 파일
    char Output[80]; // 암호화된 파일
    char Key[16];
    int time;
    Data8Word_u word1; // 8 Byte 64bit
    Data8Word_u word2; // 8 Byte 64bit
    Data8Word_u word3; // 8 Byte 64bit
    Data8Word_u word4; // 8 Byte 64bit
    Data16Word_u key128[15];
    DataWord_u SBox[256];
    Data8Word_u ESBox[256];
// Key Scheduling 함수
    void SubEncode ( Data32Word_u* &Data, int const Count );
    void SubDecode ( Data32Word_u* &Data ,int const Count );
    void KeyGen ( Data16Word_u const key );//TODO: Key 스케쥴링 함수 내부 사용

//TODO: 암호화 부분 함수
    void EFuncF ( Data8Word_u & word, Data16Word_u const Key );

//TODO: 복호화 부분 함수
    Data8Word_u DFuncF ( unsigned char const Key[16],Data8Word_u const word );
    void EFuncG ( Data8Word_u & word, Data16Word_u const Key );
    Data8Word_u DFuncG ( Data16Word_u const Key , Data8Word_u const word );

//    template <typename T> bool Equal ( T const Operand1, T const Operand2 , int const ByteLen);
//TODO : 언젠가는 Template를 써먹어야지 크크~

    DataWord_u LRotate ( DataWord_u const Operand , int const Count , int const ByteLen);
    Data4Word_u LRotate ( Data4Word_u const Operand , int const BitLen);
    DataWord_u RRotate ( DataWord_u const Operand , int const Count , int const ByteLen);
    Data4Word_u RRotate ( Data4Word_u const Operand , int const BitLen);

    DataWord_u XOR ( DataWord_u const  Operand1 , DataWord_u const Operand2,int const ByteLen);
    DataWord_u Not ( DataWord_u const Operand , int const ByteLen);
    Data32Word_u XOR ( Data32Word_u const  Operand1 , Data32Word_u const Operand2,int const ByteLen);
    Data16Word_u XOR ( Data16Word_u const  Operand1 , Data16Word_u const Operand2,int const ByteLen);
    Data8Word_u XOR ( Data8Word_u const  Operand1 , Data8Word_u const Operand2,int const ByteLen);
    Data4Word_u XOR ( Data4Word_u const  Operand1 , Data4Word_u const Operand2,int const ByteLen);
    DataByte_u XOR ( DataByte_u const  Operand1 , DataByte_u const Operand2,int const ByteLen);


    Data4Word_u EFuncG1( Data4Word_u const word, DataWord_u const Key );
    Data4Word_u ESPlus ( Data4Word_u const Operand1 , Data4Word_u const Operand2);
    Data4Word_u DFuncG1( Data4Word_u const word, DataWord_u const Key );
    Data4Word_u DSPlus ( Data4Word_u const Operand1 , Data4Word_u const Operand2);
    //TODO: Key 스케쥴링 함수 최초 암호 설정시 사용

    Data32Word_u MakeData32Word( Data8Word_u const A,Data8Word_u const B,Data8Word_u const C, Data8Word_u const D);
    // 8Byte 4 개로 32 Byte 합치는 부분
    Data32Word_u MakeData32Word( Data16Word_u const A,Data16Word_u const B);
    // 16Byte 2 개로 32 Byte 합치는 부분
    Data8Word_u MakeData8Word( DataWord_u const A,DataWord_u const B , DataWord_u const C,DataWord_u const D);
    Data8Word_u MakeData8Word( Data4Word_u const A,Data4Word_u const B);
    Data4Word_u MakeData4Word( DataByte_u const A,DataByte_u const B , DataByte_u const C,DataByte_u const D);

    void Divide32to8(Data32Word_u const Temp, Data8Word_u & A,Data8Word_u & B,Data8Word_u & C, Data8Word_u & D);
    void Divide8to2(Data8Word_u const Temp, DataWord_u & A,DataWord_u & B,DataWord_u & C, DataWord_u & D);
    void Divide4to1(Data4Word_u const Temp, DataByte_u & A,DataByte_u & B,DataByte_u & C, DataByte_u & D);
    void Divide8to4(Data8Word_u const Temp, Data4Word_u & A,Data4Word_u & B);
    void Divide16to8(Data16Word_u const Temp, Data8Word_u & A,Data8Word_u & B);
    void Divide2to1(DataWord_u const Temp, DataByte_u & A,DataByte_u & B);

    bool Equal ( Data32Word_u const Operand1, Data32Word_u const Operand2 , int const ByteLen);
    bool Equal ( Data16Word_u const Operand1, Data16Word_u const Operand2 , int const ByteLen);
    bool Equal ( Data8Word_u const Operand1, Data8Word_u const Operand2 , int const ByteLen);
    bool Equal ( Data4Word_u const Operand1, Data4Word_u const Operand2 , int const ByteLen);
    bool Equal ( DataWord_u const Operand1, DataWord_u const Operand2 , int const ByteLen);

    void bit_col_swap ( const int Idx1 , const int Idx2 ,bitmatrix &matrix);
    void bit_row_swap ( const int Idx1 , const int Idx2 ,bitmatrix &matrix);
};
//---------------------------------------------------------------------------
#endif

클래스 정의만 200라인 가까이에 실제 소스 부분은 1600라인을 육박합니다~

헐 제가 이제껏 짜본 단일 클래스중 젤 큰거네요

담번엔 만라인대 프로그램을 한번 짜봐야 할텐데~

그럼 이만~

많은 답글 부탁 드립니다.

+ -

관련 글 리스트
4634 [만해] 허걱 이런일이~ 만해 2225 2002/05/07
4638     Re:[만해] 아주 조은데요..^^ 타락천사 1832 2002/05/08
4636     Re:[만해] 허걱 이런일이~ SteelHeart 1866 2002/05/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.