import java.math.BigInteger; import java.math.BigDecimal; public class RSACracker { public static final BigInteger RSA_MODULUS_202 = new BigInteger( "7162900525229798032761816791230527296329313291232324"+ "2902378492635012082079728940539290656365223631636210"+ "00728841182238772712427862772219676577293600221789" ); //Replace with your own key public static final BigInteger ZERO = BigInteger.valueOf(0), ONE = BigInteger.valueOf(1), TWO = BigInteger.valueOf(2), FOUR = BigInteger.valueOf(4); public static void main(String[] args) { new RSACracker(RSA_MODULUS_202); } public RSACracker(final BigInteger i) { if(i.mod(TWO).equals(ZERO)) return; BigInteger maxKValue = i.add(ONE).divide(TWO); BigInteger kSearch = sqrt(new BigDecimal(i), 25).toBigInteger(); while(kSearch.pow(2).compareTo(i) < 1 && kSearch.compareTo(maxKValue) == -1) kSearch = kSearch.add(ONE); System.out.println("k = "+ kSearch); BigInteger iterationDifference; for(; kSearch.compareTo(maxKValue) == -1; kSearch = kSearch.add(ONE)) { try { BigInteger factorBase = sqrt(new BigDecimal(kSearch.pow(2).subtract(i)), 25).toBigIntegerExact(); System.out.println(i +" = ("+ (kSearch.subtract(factorBase)) +")("+ (kSearch.add(factorBase)) +")"); break; } catch(ArithmeticException e) {} } } public static final BigDecimal sqrt(final BigDecimal originalValue, int divisionScale) { int maxIterations = 50; if(originalValue.compareTo(new BigDecimal(ZERO)) == -1) { throw new ArithmeticException("Square root of a negative number."); } if(maxIterations < 1) return originalValue; BigDecimal lastValue = new BigDecimal(ZERO), sqrtValue = getInitialApproximation(originalValue), errorValue = null; int currentIteration = 0; boolean isCalculating = true; while(isCalculating) { lastValue = sqrtValue; sqrtValue = originalValue.divide(sqrtValue, divisionScale, BigDecimal.ROUND_HALF_UP); sqrtValue = sqrtValue.add(lastValue); sqrtValue = sqrtValue.divide(new BigDecimal(TWO), divisionScale, BigDecimal.ROUND_HALF_UP); errorValue = originalValue.subtract(sqrtValue.multiply(sqrtValue)); if(++currentIteration == maxIterations) { isCalculating = false; } else if(lastValue.equals(sqrtValue)) { isCalculating = errorValue.abs().compareTo(new BigDecimal(ONE)) > -1; } } return sqrtValue; } private static final BigDecimal getInitialApproximation(final BigDecimal originalValue) { int totalIntegerDigits = originalValue.toBigInteger().toString().length(); if ((totalIntegerDigits % 2) == 0) { totalIntegerDigits--; } totalIntegerDigits /= 2; return new BigDecimal(ONE).movePointRight(totalIntegerDigits); } }