import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.lang.*; import java.io.*; import java.math.BigInteger; public class RSACrackApplet extends Applet implements ActionListener { Panel p; TextArea ta; TextField modField; TextField eField; TextField pField; TextField qField; TextField cField; public static void main(String[] args) { } public String getLetter(int newVal) { if(newVal == 0) return "A"; else if(newVal == 1) return "B"; else if(newVal == 2) return "C"; else if(newVal == 3) return "D"; else if(newVal == 4) return "E"; else if(newVal == 5) return "F"; else if(newVal == 6) return "G"; else if(newVal == 7) return "H"; else if(newVal == 8) return "I"; else if(newVal == 9) return "J"; else if(newVal == 10) return "K"; else if(newVal == 11) return "L"; else if(newVal == 12) return "M"; else if(newVal == 13) return "N"; else if(newVal == 14) return "O"; else if(newVal == 15) return "P"; else if(newVal == 16) return "Q"; else if(newVal == 17) return "R"; else if(newVal == 18) return "S"; else if(newVal == 19) return "T"; else if(newVal == 20) return "U"; else if(newVal == 21) return "V"; else if(newVal == 22) return "W"; else if(newVal == 23) return "X"; else if(newVal == 24) return "Y"; else if(newVal == 25) return "Z"; return "FAIL"; } public String sub(String let) { int newVal = getSubVal(let); if(newVal == 0) return "A"; else if(newVal == 1) return "B"; else if(newVal == 2) return "C"; else if(newVal == 3) return "D"; else if(newVal == 4) return "E"; else if(newVal == 5) return "F"; else if(newVal == 6) return "G"; else if(newVal == 7) return "H"; else if(newVal == 8) return "I"; else if(newVal == 9) return "J"; else if(newVal == 10) return "K"; else if(newVal == 11) return "L"; else if(newVal == 12) return "M"; else if(newVal == 13) return "N"; else if(newVal == 14) return "O"; else if(newVal == 15) return "P"; else if(newVal == 16) return "Q"; else if(newVal == 17) return "R"; else if(newVal == 18) return "S"; else if(newVal == 19) return "T"; else if(newVal == 20) return "U"; else if(newVal == 21) return "V"; else if(newVal == 22) return "W"; else if(newVal == 23) return "X"; else if(newVal == 24) return "Y"; else if(newVal == 25) return "Z"; return "FAIL"; } public int getSubVal(String let) { if(let.equals("P")) return 0; else if(let.equals("A")) return 1; else if(let.equals("C")) return 2; else if(let.equals("K")) return 3; else if(let.equals("M")) return 4; else if(let.equals("Y")) return 5; else if(let.equals("B")) return 6; else if(let.equals("O")) return 7; else if(let.equals("X")) return 8; else if(let.equals("W"))//P A C K M Y B O X W I T H F V E D Z N L Q U R J G S return 9; else if(let.equals("I")) return 10; else if(let.equals("T")) return 11; else if(let.equals("H")) return 12; else if(let.equals("F")) return 13; else if(let.equals("V")) return 14; else if(let.equals("E")) return 15; else if(let.equals("D")) return 16; else if(let.equals("Z")) return 17; else if(let.equals("N")) return 18; else if(let.equals("L")) return 19; else if(let.equals("Q")) return 20; else if(let.equals("U")) return 21; else if(let.equals("R")) return 22; else if(let.equals("J")) return 23; else if(let.equals("G")) return 24; else if(let.equals("S")) return 25; return -1; } public String doShift(String let, int shift) { int newVal = getVal(let) + shift; if(newVal > 25) newVal=newVal-26; if(newVal == 0) return "A"; else if(newVal == 1) return "B"; else if(newVal == 2) return "C"; else if(newVal == 3) return "D"; else if(newVal == 4) return "E"; else if(newVal == 5) return "F"; else if(newVal == 6) return "G"; else if(newVal == 7) return "H"; else if(newVal == 8) return "I"; else if(newVal == 9) return "J"; else if(newVal == 10) return "K"; else if(newVal == 11) return "L"; else if(newVal == 12) return "M"; else if(newVal == 13) return "N"; else if(newVal == 14) return "O"; else if(newVal == 15) return "P"; else if(newVal == 16) return "Q"; else if(newVal == 17) return "R"; else if(newVal == 18) return "S"; else if(newVal == 19) return "T"; else if(newVal == 20) return "U"; else if(newVal == 21) return "V"; else if(newVal == 22) return "W"; else if(newVal == 23) return "X"; else if(newVal == 24) return "Y"; else if(newVal == 25) return "Z"; return "ARRRRRRG"; } public int getVal(String let) { if(let.equals("A")) return 0; else if(let.equals("B")) return 1; else if(let.equals("C")) return 2; else if(let.equals("D")) return 3; else if(let.equals("E")) return 4; else if(let.equals("F")) return 5; else if(let.equals("G")) return 6; else if(let.equals("H")) return 7; else if(let.equals("I")) return 8; else if(let.equals("J")) return 9; else if(let.equals("K")) return 10; else if(let.equals("L")) return 11; else if(let.equals("M")) return 12; else if(let.equals("N")) return 13; else if(let.equals("O")) return 14; else if(let.equals("P")) return 15; else if(let.equals("Q")) return 16; else if(let.equals("R")) return 17; else if(let.equals("S")) return 18; else if(let.equals("T")) return 19; else if(let.equals("U")) return 20; else if(let.equals("V")) return 21; else if(let.equals("W")) return 22; else if(let.equals("X")) return 23; else if(let.equals("Y")) return 24; else if(let.equals("Z")) return 25; return -1; } public void actionPerformed(ActionEvent ev) { String label = ev.getActionCommand(); if (label.equals("Do Work")) { doWork(modField.getText(), pField.getText(), qField.getText(), eField.getText(), cField.getText()); } } public RSACrackApplet() { p = new Panel(); p.setLayout(new BorderLayout()); //sets the layout manager to a border layout Panel inputPanel = new Panel(); inputPanel.setLayout(new FlowLayout()); modField = new TextField("Modulous (n)", 10); eField = new TextField("Exponent (e)", 10); pField = new TextField("Factor 1 (p)", 10); qField = new TextField("Factor 2 (q)", 10); cField = new TextField("Cipher text", 10); inputPanel.add(modField); inputPanel.add(eField); inputPanel.add(pField); inputPanel.add(qField); inputPanel.add(cField); Button b = new Button("Do Work"); //creates a new button b.addActionListener(this); //adds a listener for when this button is clicked p.add(BorderLayout.NORTH,inputPanel); p.add(BorderLayout.CENTER,b); ta = new TextArea(40,60); //adds a text area, this will be used as a console to output text to p.add(BorderLayout.SOUTH, ta); //adds the text area p.setBackground(new Color(255, 255, 255)); add("North",p); //adds the panel to the applet } public void doWork(String sM, String sP, String sQ, String sE, String sC) { BigInteger m = new BigInteger(sM); //modulous BigInteger p = new BigInteger(sP); BigInteger q = new BigInteger(sQ); BigInteger e = new BigInteger(sE); BigInteger c = new BigInteger(sC); //cipher BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); updateTextln("Phi: " +phi.toString()); BigInteger d = e.modInverse(phi); updateTextln("d: " +d.toString()); String decrypt = c.modPow(d, m).toString(); updateTextln("Decrypted: " +decrypt); updateTextln("Split in threes: "); String threes[] = {decrypt.substring(0,3), decrypt.substring(3,6), decrypt.substring(6,9), decrypt.substring(9,12), decrypt.substring(12,15), decrypt.substring(15,18), decrypt.substring(18,21), decrypt.substring(21,24)}; BigInteger bigThrees[] = new BigInteger[8]; for(int i = 0; i < threes.length; i++) { bigThrees[i] = new BigInteger(threes[i]); updateText(threes[i] +" "); } updateTextln(""); BigInteger eleven = new BigInteger("11"); BigInteger end = new BigInteger("1000"); BigInteger sev = new BigInteger("701"); int a[] = new int[8]; updateTextln("Reverse Modulous: "); for(int i = 0; i < bigThrees.length; i++) { for(BigInteger x = BigInteger.ONE; x.compareTo(end) < 0; x = x.add(BigInteger.ONE)) { if(eleven.modPow(x, sev).compareTo(bigThrees[i]) == 0) { a[i] = x.intValue(); updateText(x.toString() +" "); break; } } } updateTextln(""); updateTextln("Numbered Pairs: "); int x = 0; String lets[] = new String[16]; int letCount = 0; for(int i = 0; i < a.length; i++) { for(int z = 0; z < 26; z++) { if( (a[i] - z) % 26 == 0) { x = (a[i] - z) / 26; updateTextln(a[i] +" x: " + x +" z: " +z); lets[letCount] = getLetter(x); lets[letCount+1] = getLetter(z); letCount = letCount + 2; } } } updateTextln("Numbers to text:"); for(int i = 0; i < lets.length; i++) { updateText(lets[i]); } updateTextln(""); //0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 String newLets[] = new String[16]; newLets[0] = lets[0]; newLets[1] = lets[4]; newLets[2] = lets[8]; newLets[3] = lets[12]; newLets[4] = lets[1]; newLets[5] = lets[5]; newLets[6] = lets[9]; newLets[7] = lets[13]; newLets[8] = lets[2]; newLets[9] = lets[6]; newLets[10] = lets[10]; newLets[11] = lets[14]; newLets[12] = lets[3]; newLets[13] = lets[7]; newLets[14] = lets[11]; newLets[15] = lets[15]; updateTextln("Grid transposed text:"); for(int i = 0; i < newLets.length; i++) { updateText(newLets[i]); } updateTextln(""); updateTextln("Reverse Substitute:"); for(int i = 0; i < newLets.length; i++) { lets[i] = sub(newLets[i]); updateText(lets[i]); } updateTextln(""); updateTextln(""); String probable = "Unknown"; for(int shift = 1; shift <= 26; shift++) { String whole = ""; for(int i =0; i