|
안녕하세요 만해 입니다.
지금 암호화를 하고 있는데요
암호화 부분은 다 됬는데
복호화 부분이 안되서
원인을 찾던중
이상한 결과가 나와서요
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;
그냥 단순히 읽어서
조깼다가
다시 합쳐서 썼는데
영 모를값이 나오네요 좀 도와 주세요 ~
|