C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[17264] [만해] 정말 골아픈 건데요 비트 처리요 ~ 좀 봐주세요~
만해 [greenuri] 857 읽음    2002-04-07 22:06
안녕하세요 만해 입니다.

지금 암호화를 하고 있는데요

암호화 부분은 다 됬는데

복호화 부분이 안되서

원인을 찾던중

이상한 결과가 나와서요

void TCrypt::Encode ( void )
{
  int KeySch=0;
  __int64 FSize;
  __int64 BlockCnt;
  int SpareCnt;

  TFileStream* Ifile = new TFileStream(Source,fmOpenRead);
  TFileStream* Ofile = new TFileStream(Output,fmCreate|fmOpenWrite);
  FSize = Ifile->Size;
  BlockCnt = FSize / 32;
  SpareCnt = FSize % 32;

// 가장 마지막 문장의 길이를 32으로 맞춤.

  for ( int i = 0 ; i <= BlockCnt ; i ++ )
  {
    // 256 바이트로 나누어진 문장을 처리 하는 부분.
    Data32Word_u Work;
    if ( i == BlockCnt )
    {
      Ifile->Read(&Work,SpareCnt);
      delete Ifile;
    }
    else
      {
      Ifile->Read(&Work,32);
      Ifile->Seek(i*32,soFromBeginning);
      }
    Divide32to8(Work,word1,word2,word3,word4); //1
    Data32Word_u Result = MakeData32Word(word1,word2,word3,word4);  // <- ChipherText Block
//2
    Ofile->Write(Result.Bytes,32);
    KeyGen(key128[10]);
    KeySch = 0;
//TODO : 하위 단계 종료
  }
delete Ofile;
}


보시면 1,2 부분에서

Data32Word_u 라는 형에서요

Data8Word_u 형으로 4개로 나누었다가

그냥 다시 결합을 헀는데

전혀 이상한 글자가 파일에 입력 되네요

어떻게 된건지 모르겠습니다.

Data32Word_u TCrypt::MakeData32Word( Data8Word_u const A,Data8Word_u const B,Data8Word_u const C, Data8Word_u const D)
{
Data32Word_u Temp;
  for ( int i = 0 ; i < 8 ; i ++ )
  {
    Temp.Bytes[i].bits.a = A.Bytes[i].bits.a;
    Temp.Bytes[i].bits.b = A.Bytes[i].bits.b;
    Temp.Bytes[i].bits.c = A.Bytes[i].bits.c;
    Temp.Bytes[i].bits.d = A.Bytes[i].bits.d;
    Temp.Bytes[i].bits.e = A.Bytes[i].bits.e;
    Temp.Bytes[i].bits.f = A.Bytes[i].bits.f;
    Temp.Bytes[i].bits.g = A.Bytes[i].bits.g;
    Temp.Bytes[i].bits.h = A.Bytes[i].bits.h;

    Temp.Bytes[i+8].bits.a = B.Bytes[i].bits.a;
    Temp.Bytes[i+8].bits.b = B.Bytes[i].bits.b;
    Temp.Bytes[i+8].bits.c = B.Bytes[i].bits.c;
    Temp.Bytes[i+8].bits.d = B.Bytes[i].bits.d;
    Temp.Bytes[i+8].bits.e = B.Bytes[i].bits.e;
    Temp.Bytes[i+8].bits.f = B.Bytes[i].bits.f;
    Temp.Bytes[i+8].bits.g = B.Bytes[i].bits.g;
    Temp.Bytes[i+8].bits.h = B.Bytes[i].bits.h;

    Temp.Bytes[i+16].bits.a = C.Bytes[i].bits.a;
    Temp.Bytes[i+16].bits.b = C.Bytes[i].bits.b;
    Temp.Bytes[i+16].bits.c = C.Bytes[i].bits.c;
    Temp.Bytes[i+16].bits.d = C.Bytes[i].bits.d;
    Temp.Bytes[i+16].bits.e = C.Bytes[i].bits.e;
    Temp.Bytes[i+16].bits.f = C.Bytes[i].bits.f;
    Temp.Bytes[i+16].bits.g = C.Bytes[i].bits.g;
    Temp.Bytes[i+16].bits.h = C.Bytes[i].bits.h;

    Temp.Bytes[i+24].bits.a = D.Bytes[i].bits.a;
    Temp.Bytes[i+24].bits.b = D.Bytes[i].bits.b;
    Temp.Bytes[i+24].bits.c = D.Bytes[i].bits.c;
    Temp.Bytes[i+24].bits.d = D.Bytes[i].bits.d;
    Temp.Bytes[i+24].bits.e = D.Bytes[i].bits.e;
    Temp.Bytes[i+24].bits.f = D.Bytes[i].bits.f;
    Temp.Bytes[i+24].bits.g = D.Bytes[i].bits.g;
    Temp.Bytes[i+24].bits.h = D.Bytes[i].bits.h;
  }
return Temp;
}

void TCrypt::Divide32to8(Data32Word_u const Temp, Data8Word_u & A,Data8Word_u & B,Data8Word_u & C, Data8Word_u & D)
{
  for ( int i = 0 ; i < 8 ; i ++ )
  {
     A.Bytes[i].bits.a = Temp.Bytes[i].bits.a ;
     A.Bytes[i].bits.b = Temp.Bytes[i].bits.b ;
     A.Bytes[i].bits.c = Temp.Bytes[i].bits.c ;
     A.Bytes[i].bits.d = Temp.Bytes[i].bits.d ;
     A.Bytes[i].bits.e = Temp.Bytes[i].bits.e ;
     A.Bytes[i].bits.f = Temp.Bytes[i].bits.f ;
     A.Bytes[i].bits.g = Temp.Bytes[i].bits.g ;
     A.Bytes[i].bits.h = Temp.Bytes[i].bits.h ;

     B.Bytes[i].bits.a = Temp.Bytes[i+8].bits.a;
     B.Bytes[i].bits.b = Temp.Bytes[i+8].bits.b;
     B.Bytes[i].bits.c = Temp.Bytes[i+8].bits.c;
     B.Bytes[i].bits.d = Temp.Bytes[i+8].bits.d;
     B.Bytes[i].bits.e = Temp.Bytes[i+8].bits.e;
     B.Bytes[i].bits.f = Temp.Bytes[i+8].bits.f;
     B.Bytes[i].bits.g = Temp.Bytes[i+8].bits.g;
     B.Bytes[i].bits.h = Temp.Bytes[i+8].bits.h;

     C.Bytes[i].bits.a = Temp.Bytes[i+16].bits.a;
     C.Bytes[i].bits.b = Temp.Bytes[i+16].bits.b;
     C.Bytes[i].bits.c = Temp.Bytes[i+16].bits.c;
     C.Bytes[i].bits.d = Temp.Bytes[i+16].bits.d;
     C.Bytes[i].bits.e = Temp.Bytes[i+16].bits.e;
     C.Bytes[i].bits.f = Temp.Bytes[i+16].bits.f;
     C.Bytes[i].bits.g = Temp.Bytes[i+16].bits.g;
     C.Bytes[i].bits.h = Temp.Bytes[i+16].bits.h;

     D.Bytes[i].bits.a = Temp.Bytes[i+24].bits.a;
     D.Bytes[i].bits.b = Temp.Bytes[i+24].bits.b;
     D.Bytes[i].bits.c = Temp.Bytes[i+24].bits.c;
     D.Bytes[i].bits.d = Temp.Bytes[i+24].bits.d;
     D.Bytes[i].bits.e = Temp.Bytes[i+24].bits.e;
     D.Bytes[i].bits.f = Temp.Bytes[i+24].bits.f;
     D.Bytes[i].bits.g = Temp.Bytes[i+24].bits.g;
     D.Bytes[i].bits.h = Temp.Bytes[i+24].bits.h;
  }
}

그리고 여기는 형을 정의 한 곳요

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;
  unsigned short IData:8;
  }DataByte_u;

typedef union Data8Word__u{
//  struct  {
//    Data4Word_u Hi;
//    Data4Word_u Lo;
//    }Word2;
//    DataWord__u Words[4];
    DataByte_u Bytes[8];
//    unsigned char Data[8];
//    unsigned long  IData;
} Data8Word_u;

typedef union Data32Word__u{
//  struct {
//    Data16Word_u Hi;
//    Data16Word_u Lo;
//    }Word8;
//    DataWord__u Words[16];
    DataByte_u Bytes[32];
//    unsigned char Data[32];
//    unsigned long IData[4];
} Data32Word_u;

그냥 단순히 읽어서

조깼다가

다시 합쳐서 썼는데

영 모를값이 나오네요 좀 도와 주세요 ~



+ -

관련 글 리스트
17264 [만해] 정말 골아픈 건데요 비트 처리요 ~ 좀 봐주세요~ 만해 857 2002/04/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.