jodd-core/src/main/java/jodd/crypt/Threefish.java
public void blockDecrypt(final long[] c, final long[] p) {
		// initial value = plain
		System.arraycopy(c, 0, vd, 0, nw);

		for (int d = nr; d > 0; d--) { // do the rounds
			// calculate e{d,i}
			if (d % SUBKEY_INTERVAL == 0) {
				final int s = d / SUBKEY_INTERVAL;
				keySchedule(s); // calculate same keys

				for (int i = 0; i < nw; i++) {
					fd[i] = vd[i] - ksd[i];
				}

			} else {
				System.arraycopy(vd, 0, fd, 0, nw);
			}

			for (int i = 0; i < nw; i++) {
				ed[i] = fd[rpi[i]];
			}

			for (int j = 0; j < nw / 2; j++) {
				y[0] = ed[j * 2];
				y[1] = ed[j * 2 + 1];

				demix(j, d - 1);

				vd[j * 2] = x[0];
				vd[j * 2 + 1] = x[1];
			}
		}

		// do the first keyschedule
		keySchedule(0);

		for (int i = 0; i < nw; i++) {
			p[i] = vd[i] - ksd[i];
		}
	}
public void blockDecrypt(final long[] c, final long[] p) {
		// initial value = plain
		System.arraycopy(c, 0, vd, 0, nw);

		for (int d = nr; d > 0; d--) { // do the rounds
			// calculate e{d,i}
			if (d % SUBKEY_INTERVAL == 0) {
				final int s = d / SUBKEY_INTERVAL;
				keySchedule(s); // calculate same keys

				for (int i = 0; i < nw; i++) {
					fd[i] = vd[i] - ksd[i];
				}

			} else {
				System.arraycopy(vd, 0, fd, 0, nw);
			}

			for (int i = 0; i < nw; i++) {
				ed[i] = fd[rpi[i]];
			}

			for (int j = 0; j < nw / 2; j++) {
				y[0] = ed[j * 2];
				y[1] = ed[j * 2 + 1];

				demix(j, d - 1);

				vd[j * 2] = x[0];
				vd[j * 2 + 1] = x[1];
			}
		}

		// do the first keyschedule
		keySchedule(0);

		for (int i = 0; i < nw; i++) {
			p[i] = vd[i] - ksd[i];
		}
	}
Implementation of the D(K, T, C) function.
The K and T values should be set previously using the init() method. This version is the 64 bit implementation
of Threefish.

@param c the cipher text
@param p the plain text