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

C/C++ Q/A
[593] [만해] 알고리즘좀 봐주세요~
만해 [greenuri] 1740 읽음    2002-05-09 10:52
안녕하세요 만해입니다.

지금 하고 있는 암호화 부분의

키스켸쥴링 부분 함수 인데요

이전의 소스는 단지 5라인 짜리로 해서

되게 간단했었는데

이번에 알고리즘이 바꿔지는 바람에 알고리즘이 좀 복잡해 졌네요

그에 따라서 시간도 오래 걸리고요~

이 알고리즘을 제가 줄인데로 줄였는데도

시간이 오래 걸려서요

고수님들이 보시고요

좀 줄일수 있는데 있음 좀 알려주세요

소스가 조금 길어요~

void TCrypt::KeyGen ( Data16Word_u const key )//TODO: Key 스케쥴링 함수
{
  bitdeque matrix1(128);
  bitdeque matrix2(128);
  bitdeque matrix3(64);
  bitdeque matrix4(64);
  bitdeque matrix5(64);
  bitdeque matrix6(64);
  bitdeque KMatrix(128);
  bitdeque::iterator iteri,iterj;
//  int idx = 0;
  int ColIdx[8]; int RowIdx[8];
  Data16Word_u KWord;
  int j=0;
//  key128[0] = key;

  for ( int i = 0 ; i < 8 ; i++)
    {
      KMatrix[i*16]   = key.Bytes[i].bits.a;
      KMatrix[i*16+1] = key.Bytes[i].bits.b;
      KMatrix[i*16+2] = key.Bytes[i].bits.c;
      KMatrix[i*16+3] = key.Bytes[i].bits.d;
      KMatrix[i*16+4] = key.Bytes[i].bits.e;
      KMatrix[i*16+5] = key.Bytes[i].bits.f;
      KMatrix[i*16+6] = key.Bytes[i].bits.g;
      KMatrix[i*16+7] = key.Bytes[i].bits.h;
    }

  for ( int KeyIdx = 0 ; KeyIdx < 15 ; KeyIdx ++ )
  {
    matrix1 = KMatrix;
    matrix2 = matrix1;
    rotate(matrix1.begin(),matrix1.begin()+6,matrix1.end());

    for ( iterj = matrix1.begin(), iteri = matrix2.begin() ;
         (iteri < matrix2.end())&&(iterj < matrix1.end());  iteri++,iterj++ )
      *iteri =  *iteri ^ *iterj;

    for (int i = 0,j=0; i < 8;i++ )
    {
      ColIdx[j] = (matrix1[(i*3)] * 1 + matrix1[(i*3)+1] * 2 + matrix1[(i*3)+2] * 4) ^
                (matrix2[(i*3)+24] * 1 + matrix2[(i*3)+25] * 2 + matrix2[(i*3)+26] * 4);

      RowIdx[j++] = (matrix1[(i*3)+48] * 1 + matrix1[(i*3)+49] * 2 + matrix1[(i*3)+50] * 4) ^
                (matrix2[(i*3)+72] * 1 + matrix2[(i*3)+73] * 2 + matrix2[(i*3)+74] * 4);
    }

    matrix3.assign(matrix1.begin(),matrix1.begin()+63);
    matrix4.assign(matrix1.begin()+64,matrix1.end());
    matrix5.assign(matrix2.begin(),matrix2.begin()+63);
    matrix6.assign(matrix2.begin()+64,matrix2.end());

    for ( int j = 0 ; j < 4 ; j ++ )
      {
        for ( int i = 0 ; i < 8 ; i++ )
        {
          swap(matrix3[i*8+ColIdx[j]],matrix3[i*8+ColIdx[j+4]]);
          swap(matrix4[i*8+ColIdx[j]],matrix4[i*8+ColIdx[j+4]]);
          swap(matrix5[i*8+ColIdx[j]],matrix5[i*8+ColIdx[j+4]]);
          swap(matrix6[i*8+ColIdx[j]],matrix6[i*8+ColIdx[j+4]]);
        }
      }

     for ( int j = 0 ; j < 4 ; j ++ )
      {
        for ( int i = 0 ; i < 8 ; i++ )
        {
          swap(matrix3[i+RowIdx[j]*8],matrix3[i+RowIdx[j+4]*8]);
          swap(matrix4[i+RowIdx[j]*8],matrix4[i+RowIdx[j+4]*8]);
          swap(matrix5[i+RowIdx[j]*8],matrix5[i+RowIdx[j+4]*8]);
          swap(matrix6[i+RowIdx[j]*8],matrix6[i+RowIdx[j+4]*8]);
        }
      }

    for ( int i = 0 ; i < 8 ; i++ )
      for ( int j = 0 ; j < 8 ;j++ )
        {
          matrix3[i*8+j] = matrix3[i*8+j] ^ matrix4[j*8+i];
          matrix5[i*8+j] = matrix5[i*8+j] ^ matrix6[j*8+i];
        }

    KMatrix.insert(KMatrix.begin(),matrix3.begin(),matrix3.end());
    KMatrix.insert(KMatrix.begin()+64,matrix5.begin(),matrix5.end());

    for ( int j = 0 ; j < 16 ; j++ )
    {
      key128[KeyIdx].Bytes[j].bits.a = KMatrix[j*8];
      key128[KeyIdx].Bytes[j].bits.b = KMatrix[j*8+1];
      key128[KeyIdx].Bytes[j].bits.c = KMatrix[j*8+2];
      key128[KeyIdx].Bytes[j].bits.d = KMatrix[j*8+3];
      key128[KeyIdx].Bytes[j].bits.e = KMatrix[j*8+4];
      key128[KeyIdx].Bytes[j].bits.f = KMatrix[j*8+5];
      key128[KeyIdx].Bytes[j].bits.g = KMatrix[j*8+6];
      key128[KeyIdx].Bytes[j].bits.h = KMatrix[j*8+7];
    }
  }
}

행열 연산을 해야 하는데

행열을 안하고 그냥 선형 할당자에 인덱스를 통해 이리꼬고, 저리꼬고 해서

행렬 같이 연산하는걸로 했습니다.

그리고 보시면 아시겠지만

for문이 되게 많아요`

이런걸 좀 줄여야 하는데

고수님들의 조언 부탁 드립니다.

+ -

관련 글 리스트
593 [만해] 알고리즘좀 봐주세요~ 만해 1740 2002/05/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.