private static void Enc(ref uint ll, uint r, BlowfishData key, int pi) { ll ^= key.P[pi]; var t = key.S[0 + ((r >> 24) & 0xFFU)]; t += key.S[256 + ((r >> 16) & 0xFFU)]; t ^= key.S[512 + ((r >> 8) & 0xFFU)]; t += key.S[768 + (r & 0xFFU)]; ll ^= t; }
public static void Decrypt(uint[] data, int offset, BlowfishData key) { var l = data[offset]; var r = data[offset + 1]; l ^= key.P[BfRounds + 1]; Enc(ref r, l, key, 4); Enc(ref l, r, key, 3); Enc(ref r, l, key, 2); Enc(ref l, r, key, 1); r ^= key.P[0]; data[offset + 1] = l & 0xFFFFFFFFU; data[offset] = r & 0xFFFFFFFFU; }
public static void SetKey(byte[] data, BlowfishData key) { byte d = 0; const byte end = 8; uint[] im = { 0U, 0U }; Array.Copy(BfInit.P, key.P, BfInit.P.Length); Array.Copy(BfInit.S, key.S, BfInit.S.Length); for (var i = 0; i < 6; ++i) { uint ri = data[d++]; if (d >= end) { d = 0; } ri <<= 8; ri |= data[d++]; if (d >= end) { d = 0; } ri <<= 8; ri |= data[d++]; if (d >= end) { d = 0; } ri <<= 8; ri |= data[d++]; if (d >= end) { d = 0; } key.P[i] ^= ri; } im[0] = 0; im[1] = 0; for (var ii = 0; ii < 6; ii += 2) { Encrypt(im, 0, key); key.P[ii] = im[0]; key.P[ii + 1] = im[1]; } for (var k = 0; k < 1024; k += 2) { Encrypt(im, 0, key); key.S[k] = im[0]; key.S[k + 1] = im[1]; } }