示例#1
0
文件: crypt.cpp 项目: BITINT/DEFCON2
void CryptData::DecryptBlock20(unsigned char *Buf)
{
  unsigned char InBuf[16];
  unsigned int A,B,C,D,T,TA,TB;
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
  A=((unsigned int)Buf[0]|((unsigned int)Buf[1]<<8)|((unsigned int)Buf[2]<<16)|((unsigned int)Buf[3]<<24))^Key[0];
  B=((unsigned int)Buf[4]|((unsigned int)Buf[5]<<8)|((unsigned int)Buf[6]<<16)|((unsigned int)Buf[7]<<24))^Key[1];
  C=((unsigned int)Buf[8]|((unsigned int)Buf[9]<<8)|((unsigned int)Buf[10]<<16)|((unsigned int)Buf[11]<<24))^Key[2];
  D=((unsigned int)Buf[12]|((unsigned int)Buf[13]<<8)|((unsigned int)Buf[14]<<16)|((unsigned int)Buf[15]<<24))^Key[3];
#else
  uint32 *BufPtr=(uint32 *)Buf;
  A=BufPtr[0]^Key[0];
  B=BufPtr[1]^Key[1];
  C=BufPtr[2]^Key[2];
  D=BufPtr[3]^Key[3];
#endif
  memcpy(InBuf,Buf,sizeof(InBuf));
  for(int I=NROUNDS-1;I>=0;I--)
  {
    T=((C+rol(D,11,32))^Key[I&3]);
    TA=A^substLong(T);
    T=((D^rol(C,17,32))+Key[I&3]);
    TB=B^substLong(T);
    A=C;
    B=D;
    C=TA;
    D=TB;
  }
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
  C^=Key[0];
  Buf[0]=(unsigned char)C;
  Buf[1]=(unsigned char)(C>>8);
  Buf[2]=(unsigned char)(C>>16);
  Buf[3]=(unsigned char)(C>>24);
  D^=Key[1];
  Buf[4]=(unsigned char)D;
  Buf[5]=(unsigned char)(D>>8);
  Buf[6]=(unsigned char)(D>>16);
  Buf[7]=(unsigned char)(D>>24);
  A^=Key[2];
  Buf[8]=(unsigned char)A;
  Buf[9]=(unsigned char)(A>>8);
  Buf[10]=(unsigned char)(A>>16);
  Buf[11]=(unsigned char)(A>>24);
  B^=Key[3];
  Buf[12]=(unsigned char)B;
  Buf[13]=(unsigned char)(B>>8);
  Buf[14]=(unsigned char)(B>>16);
  Buf[15]=(unsigned char)(B>>24);
#else
  BufPtr[0]=C^Key[0];
  BufPtr[1]=D^Key[1];
  BufPtr[2]=A^Key[2];
  BufPtr[3]=B^Key[3];
#endif
  UpdKeys(InBuf);
}
示例#2
0
文件: crypt.cpp 项目: Bootz/nzbm
void CryptData::EncryptBlock20(byte *Buf)
{
  uint A,B,C,D,T,TA,TB;
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
  A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0];
  B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1];
  C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2];
  D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3];
#else
  uint32 *BufPtr=(uint32 *)Buf;
  A=BufPtr[0]^Key[0];
  B=BufPtr[1]^Key[1];
  C=BufPtr[2]^Key[2];
  D=BufPtr[3]^Key[3];
#endif
  for(int I=0;I<NROUNDS;I++)
  {
    T=((C+rol(D,11,32))^Key[I&3]);
    TA=A^substLong(T);
    T=((D^rol(C,17,32))+Key[I&3]);
    TB=B^substLong(T);
    A=C;
    B=D;
    C=TA;
    D=TB;
  }
#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT)
  C^=Key[0];
  Buf[0]=(byte)C;
  Buf[1]=(byte)(C>>8);
  Buf[2]=(byte)(C>>16);
  Buf[3]=(byte)(C>>24);
  D^=Key[1];
  Buf[4]=(byte)D;
  Buf[5]=(byte)(D>>8);
  Buf[6]=(byte)(D>>16);
  Buf[7]=(byte)(D>>24);
  A^=Key[2];
  Buf[8]=(byte)A;
  Buf[9]=(byte)(A>>8);
  Buf[10]=(byte)(A>>16);
  Buf[11]=(byte)(A>>24);
  B^=Key[3];
  Buf[12]=(byte)B;
  Buf[13]=(byte)(B>>8);
  Buf[14]=(byte)(B>>16);
  Buf[15]=(byte)(B>>24);
#else
  BufPtr[0]=C^Key[0];
  BufPtr[1]=D^Key[1];
  BufPtr[2]=A^Key[2];
  BufPtr[3]=B^Key[3];
#endif
  UpdKeys(Buf);
}