public void BlockDecrypt(byte[] input, int inOffset, byte[] output, int outOffset) { uint t; int i; uint[] lr = new uint[2]; lr[0] = CipherUtil.GetIntLE(input, inOffset); lr[1] = CipherUtil.GetIntLE(input, inOffset + 4); initPerm(lr); t = (lr[1] << 1) | (lr[1] >> 31); lr[1] = (lr[0] << 1) | (lr[0] >> 31); lr[0] = t; for (i = 30; i > 0; i -= 4) { desCipher1(lr, i); desCipher2(lr, i - 2); } lr[0] = (lr[0] >> 1) | (lr[0] << 31); lr[1] = (lr[1] >> 1) | (lr[1] << 31); finalPerm(lr); CipherUtil.PutIntLE(lr[0], output, outOffset); CipherUtil.PutIntLE(lr[1], output, outOffset + 4); }
public void InitializeKey(byte[] key, int offset) { uint i, c, d, t, s, shifts; c = CipherUtil.GetIntLE(key, offset + 0); d = CipherUtil.GetIntLE(key, offset + 4); t = ((d >> 4) ^ c) & 0x0f0f0f0f; c ^= t; d ^= t << 4; t = (((c << (16 - (-2))) ^ c) & 0xcccc0000); c = c ^ t ^ (t >> (16 - (-2))); t = (((d << (16 - (-2))) ^ d) & 0xcccc0000); d = d ^ t ^ (t >> (16 - (-2))); t = ((d >> 1) ^ c) & 0x55555555; c ^= t; d ^= t << 1; t = ((c >> 8) ^ d) & 0x00ff00ff; d ^= t; c ^= t << 8; t = ((d >> 1) ^ c) & 0x55555555; c ^= t; d ^= t << 1; d = ((d & 0xff) << 16) | (d & 0xff00) | ((d >> 16) & 0xff) | ((c >> 4) & 0xf000000); c &= 0x0fffffff; shifts = 0x7efc; for (i = 0; i < 16; i++) { if ((shifts & 1) != 0) { c = ((c >> 2) | (c << 26)); d = ((d >> 2) | (d << 26)); } else { c = ((c >> 1) | (c << 27)); d = ((d >> 1) | (d << 27)); } shifts >>= 1; c &= 0x0fffffff; d &= 0x0fffffff; s = SKB[0, (c) & 0x3f] | SKB[1, ((c >> 6) & 0x03) | ((c >> 7) & 0x3c)] | SKB[2, ((c >> 13) & 0x0f) | ((c >> 14) & 0x30)] | SKB[3, ((c >> 20) & 0x01) | ((c >> 21) & 0x06) | ((c >> 22) & 0x38)]; t = SKB[4, (d) & 0x3f] | SKB[5, ((d >> 7) & 0x03) | ((d >> 8) & 0x3c)] | SKB[6, (d >> 15) & 0x3f] | SKB[7, ((d >> 21) & 0x0f) | ((d >> 22) & 0x30)]; _key[i * 2] = ((t << 16) | (s & 0xffff)); s = ((s >> 16) | (t & 0xffff0000)); _key[(i * 2) + 1] = (s << 4) | (s >> 28); } }
public void initializeKey(byte[] key) { int i, j, len = key.Length; uint temp; Array.Copy(blowfish_pbox, 0, P, 0, 18); Array.Copy(blowfish_sbox, 0, S0, 0, 256); Array.Copy(blowfish_sbox, 256, S1, 0, 256); Array.Copy(blowfish_sbox, 512, S2, 0, 256); Array.Copy(blowfish_sbox, 768, S3, 0, 256); for (j = 0, i = 0; i < 16 + 2; i++) { temp = (((uint)(key[j]) << 24) | ((uint)(key[(j + 1) % len]) << 16) | ((uint)(key[(j + 2) % len]) << 8) | ((uint)(key[(j + 3) % len]))); P[i] = P[i] ^ temp; j = (j + 4) % len; } byte[] LR = new byte[8]; for (i = 0; i < 16 + 2; i += 2) { blockEncrypt(LR, 0, LR, 0); P[i] = CipherUtil.GetIntBE(LR, 0); P[i + 1] = CipherUtil.GetIntBE(LR, 4); } for (j = 0; j < 256; j += 2) { blockEncrypt(LR, 0, LR, 0); S0[j] = CipherUtil.GetIntBE(LR, 0); S0[j + 1] = CipherUtil.GetIntBE(LR, 4); } for (j = 0; j < 256; j += 2) { blockEncrypt(LR, 0, LR, 0); S1[j] = CipherUtil.GetIntBE(LR, 0); S1[j + 1] = CipherUtil.GetIntBE(LR, 4); } for (j = 0; j < 256; j += 2) { blockEncrypt(LR, 0, LR, 0); S2[j] = CipherUtil.GetIntBE(LR, 0); S2[j + 1] = CipherUtil.GetIntBE(LR, 4); } for (j = 0; j < 256; j += 2) { blockEncrypt(LR, 0, LR, 0); S3[j] = CipherUtil.GetIntBE(LR, 0); S3[j + 1] = CipherUtil.GetIntBE(LR, 4); } }
public void EncryptCBC(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) { int nBlocks = inputLen / 8; for (int bc = 0; bc < nBlocks; bc++) { CipherUtil.BlockXor(input, inputOffset, 8, _iv, 0); BlockEncrypt(_iv, 0, output, outputOffset); Array.Copy(output, outputOffset, _iv, 0, 8); inputOffset += 8; outputOffset += 8; } }
public void encryptCBC(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) { int nBlocks = inputLen / BLOCK_SIZE; for (int bc = 0; bc < nBlocks; bc++) { CipherUtil.BlockXor(input, inputOffset, BLOCK_SIZE, IV, 0); blockEncrypt(IV, 0, output, outputOffset); Array.Copy(output, outputOffset, IV, 0, BLOCK_SIZE); inputOffset += BLOCK_SIZE; outputOffset += BLOCK_SIZE; } }
public void encryptCBC(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) { int block_size = GetBlockSize(); int nBlocks = inputLen / block_size; for (int bc = 0; bc < nBlocks; bc++) { CipherUtil.BlockXor(input, inputOffset, block_size, _IV, 0); blockEncrypt(_IV, 0, output, outputOffset); Array.Copy(output, outputOffset, _IV, 0, block_size); inputOffset += block_size; outputOffset += block_size; } }
public void blockDecrypt(byte[] input, int inOffset, byte[] output, int outOffset) { uint L, R; L = CipherUtil.GetIntBE(input, inOffset); R = CipherUtil.GetIntBE(input, inOffset + 4); L ^= P[17]; R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[16]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[15]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[14]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[13]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[12]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[11]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[10]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[9]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[8]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[7]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[6]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[5]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[4]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[3]); R ^= ((((S0[(int)((L >> 24) & 0xff)] + S1[(int)((L >> 16) & 0xff)]) ^ S2[(int)((L >> 8) & 0xff)]) + S3[(int)(L & 0xff)]) ^ P[2]); L ^= ((((S0[(int)((R >> 24) & 0xff)] + S1[(int)((R >> 16) & 0xff)]) ^ S2[(int)((R >> 8) & 0xff)]) + S3[(int)(R & 0xff)]) ^ P[1]); R ^= P[0]; CipherUtil.PutIntBE(R, output, outOffset); CipherUtil.PutIntBE(L, output, outOffset + 4); }