예제 #1
0
void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
{
   ulong32 R, L;

   _ARGCHK(pt != NULL);
   _ARGCHK(ct != NULL);
   _ARGCHK(key != NULL);

   LOAD32H(L,&pt[0]); 
   LOAD32H(R,&pt[4]);

   L ^= FI(R, key->cast5.K[0], key->cast5.K[16]);
   R ^= FII(L, key->cast5.K[1], key->cast5.K[17]);
   L ^= FIII(R, key->cast5.K[2], key->cast5.K[18]);
   R ^= FI(L, key->cast5.K[3], key->cast5.K[19]);
   L ^= FII(R, key->cast5.K[4], key->cast5.K[20]);
   R ^= FIII(L, key->cast5.K[5], key->cast5.K[21]);
   L ^= FI(R, key->cast5.K[6], key->cast5.K[22]);
   R ^= FII(L, key->cast5.K[7], key->cast5.K[23]);
   L ^= FIII(R, key->cast5.K[8], key->cast5.K[24]);
   R ^= FI(L, key->cast5.K[9], key->cast5.K[25]);
   L ^= FII(R, key->cast5.K[10], key->cast5.K[26]);
   R ^= FIII(L, key->cast5.K[11], key->cast5.K[27]);
   if (key->cast5.keylen > 10) {
      L ^= FI(R, key->cast5.K[12], key->cast5.K[28]);
      R ^= FII(L, key->cast5.K[13], key->cast5.K[29]);
      L ^= FIII(R, key->cast5.K[14], key->cast5.K[30]);
      R ^= FI(L, key->cast5.K[15], key->cast5.K[31]);
   }
   STORE32H(R,&ct[0]);
   STORE32H(L,&ct[4]);
}
예제 #2
0
파일: cast5.c 프로젝트: MalaGaM/nxscripts
int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
#endif
{
   ulong32 R, L;

   LTC_ARGCHK(pt   != NULL);
   LTC_ARGCHK(ct   != NULL);
   LTC_ARGCHK(skey != NULL);

   LOAD32H(R,&ct[0]);
   LOAD32H(L,&ct[4]);
   if (skey->cast5.keylen > 10) {
      R ^= FI(L, skey->cast5.K[15], skey->cast5.K[31]);
      L ^= FIII(R, skey->cast5.K[14], skey->cast5.K[30]);
      R ^= FII(L, skey->cast5.K[13], skey->cast5.K[29]);
      L ^= FI(R, skey->cast5.K[12], skey->cast5.K[28]);
   }
   R ^= FIII(L, skey->cast5.K[11], skey->cast5.K[27]);
   L ^= FII(R, skey->cast5.K[10], skey->cast5.K[26]);
   R ^= FI(L, skey->cast5.K[9], skey->cast5.K[25]);
   L ^= FIII(R, skey->cast5.K[8], skey->cast5.K[24]);
   R ^= FII(L, skey->cast5.K[7], skey->cast5.K[23]);
   L ^= FI(R, skey->cast5.K[6], skey->cast5.K[22]);
   R ^= FIII(L, skey->cast5.K[5], skey->cast5.K[21]);
   L ^= FII(R, skey->cast5.K[4], skey->cast5.K[20]);
   R ^= FI(L, skey->cast5.K[3], skey->cast5.K[19]);
   L ^= FIII(R, skey->cast5.K[2], skey->cast5.K[18]);
   R ^= FII(L, skey->cast5.K[1], skey->cast5.K[17]);
   L ^= FI(R, skey->cast5.K[0], skey->cast5.K[16]);
   STORE32H(L,&pt[0]);
   STORE32H(R,&pt[4]);

   return CRYPT_OK;
}
예제 #3
0
int cast5_decrypt(cast5_key *skey, const SilcUInt32 ct[2],
		  SilcUInt32 pt[2])
{
   SilcUInt32 R, L;

   R = ct[0];
   L = ct[1];

   if (skey->keylen > 10) {
      R ^= FI(L, skey->K[15], skey->K[31]);
      L ^= FIII(R, skey->K[14], skey->K[30]);
      R ^= FII(L, skey->K[13], skey->K[29]);
      L ^= FI(R, skey->K[12], skey->K[28]);
   }
   R ^= FIII(L, skey->K[11], skey->K[27]);
   L ^= FII(R, skey->K[10], skey->K[26]);
   R ^= FI(L, skey->K[9], skey->K[25]);
   L ^= FIII(R, skey->K[8], skey->K[24]);
   R ^= FII(L, skey->K[7], skey->K[23]);
   L ^= FI(R, skey->K[6], skey->K[22]);
   R ^= FIII(L, skey->K[5], skey->K[21]);
   L ^= FII(R, skey->K[4], skey->K[20]);
   R ^= FI(L, skey->K[3], skey->K[19]);
   L ^= FIII(R, skey->K[2], skey->K[18]);
   R ^= FII(L, skey->K[1], skey->K[17]);
   L ^= FI(R, skey->K[0], skey->K[16]);

   pt[0] = L;
   pt[1] = R;

   return TRUE;
}