public static byte[] DecryptBlock(uint[] v, uint[] k) { if (v == null || k == null) { return(null); } if (k.Length < 4) { return(null); } uint n = (uint)v.Length; if (n == 0) { return(null); } if (n <= 1) { return new byte[1] { 0 } } ; // algorithm doesn't work for n<2 so fudge by adding a null uint q = (uint)(6 + 52 / n); n--; uint z = v[n], y = v[0]; uint mx, e, sum = q * DELTA; uint p = 0; while (sum != 0) { e = sum >> 2 & 3; for (p = n; p > 0; p--) { z = v[p - 1]; mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); y = v[p] -= mx; } z = v[n]; mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); y = v[0] -= mx; sum -= DELTA; } return(StrConvert.LongsToStr(v)); }
public static byte[] EncryptBlock(uint[] v, uint[] k) { if (v == null || k == null) { return(null); } if (k.Length < 4) { return(null); } int n = v.Length; if (n == 0) { return(null); } if (n <= 1) { return new byte[1] { 0 } } ; // algorithm doesn't work for n<2 so fudge by adding a null uint q = (uint)(6 + 52 / n); n--; uint z = v[n], y = v[0]; uint mx, e, sum = 0; while (q-- > 0) { // 6 + 52/n operations gives between 6 & 32 mixes on each word sum += DELTA; e = sum >> 2 & 3; for (int p = 0; p < n; p++) { y = v[p + 1]; mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); z = v[p] += mx; } y = v[0]; mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z); z = v[n] += mx; } return(StrConvert.LongsToStr(v)); }