public static bool RsaOTDecrypt(ref byte[] buffer, int position, int length) { if (length - position != 128) return false; byte[] temp = new byte[128]; Array.Copy(buffer, position, temp, 0, 128); BigInteger input = new BigInteger(temp); BigInteger output; BigInteger m1 = input.modPow(otServerDP, otServerP); // m2 = c^dq mod q BigInteger m2 = input.modPow(otServerDQ, otServerQ); BigInteger h; if (m2 > m1) { // thanks to benm! h = otServerP - ((m2 - m1) * otServerInverseQ % otServerP); output = m2 + otServerQ * h; } else { // h = (m1 - m2) * qInv mod p h = (m1 - m2) * otServerInverseQ % otServerP; // m = m2 + q * h; output = m2 + otServerQ * h; } Array.Copy(GetPaddedValue(output), 0, buffer, position, 128); return true; }
public static bool RsaEncrypt(BigInteger e, BigInteger m, ref byte[] buffer, int position) { byte[] temp = new byte[128]; Array.Copy(buffer, position, temp, 0, 128); BigInteger input = new BigInteger(temp); BigInteger output = input.modPow(e, m); // it's sometimes possible for the results to be a byte short // and this can break some software so we 0x00 pad the result Array.Copy(GetPaddedValue(output), 0, buffer, position, 128); return true; }