|
안녕하세요 만해입니다.
지금 하고 있는 암호화 부분의
키스켸쥴링 부분 함수 인데요
이전의 소스는 단지 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문이 되게 많아요`
이런걸 좀 줄여야 하는데
고수님들의 조언 부탁 드립니다.
|