void Blowfish::ProcessBlock(const byte *in, byte *out) const { word32 left, right; GetBlockBigEndian(in, left, right); const word32 *const s=sbox; const word32 *p=pbox; left ^= p[0]; for (unsigned i=0; i<ROUNDS/2; i++) { right ^= (((s[GETBYTE(left,3)] + s[256+GETBYTE(left,2)]) ^ s[2*256+GETBYTE(left,1)]) + s[3*256+GETBYTE(left,0)]) ^ p[2*i+1]; left ^= (((s[GETBYTE(right,3)] + s[256+GETBYTE(right,2)]) ^ s[2*256+GETBYTE(right,1)]) + s[3*256+GETBYTE(right,0)]) ^ p[2*i+2]; } right ^= p[ROUNDS+1]; PutBlockBigEndian(out, right, left); }
void DES_EDE3_Decryption::ProcessBlock(const byte *inBlock, byte *outBlock) const { word32 l,r; GetBlockBigEndian(inBlock, l, r); IPERM(l,r); d3.RawProcessBlock(l, r); e2.RawProcessBlock(r, l); d1.RawProcessBlock(l, r); FPERM(l,r); PutBlockBigEndian(outBlock, r, l); }
// Encrypt or decrypt a block of data in ECB mode void DES::ProcessBlock(const byte *inBlock, byte * outBlock) const { word32 l,r; GetBlockBigEndian(inBlock, l, r); IPERM(l,r); const word32 *kptr=k; for (unsigned i=0; i<8; i++) { word32 work = rotrFixed(r, 4U) ^ kptr[4*i+0]; l ^= Spbox[6][(work) & 0x3f] ^ Spbox[4][(work >> 8) & 0x3f] ^ Spbox[2][(work >> 16) & 0x3f] ^ Spbox[0][(work >> 24) & 0x3f]; work = r ^ kptr[4*i+1]; l ^= Spbox[7][(work) & 0x3f] ^ Spbox[5][(work >> 8) & 0x3f] ^ Spbox[3][(work >> 16) & 0x3f] ^ Spbox[1][(work >> 24) & 0x3f]; work = rotrFixed(l, 4U) ^ kptr[4*i+2]; r ^= Spbox[6][(work) & 0x3f] ^ Spbox[4][(work >> 8) & 0x3f] ^ Spbox[2][(work >> 16) & 0x3f] ^ Spbox[0][(work >> 24) & 0x3f]; work = l ^ kptr[4*i+3]; r ^= Spbox[7][(work) & 0x3f] ^ Spbox[5][(work >> 8) & 0x3f] ^ Spbox[3][(work >> 16) & 0x3f] ^ Spbox[1][(work >> 24) & 0x3f]; } FPERM(l,r); PutBlockBigEndian(outBlock, r, l); }