public StreamCipherDecryptor() { cryptogramsArray = Operations.getCryptogramsArray(cryptogramsFilePath); codeToDecrypt = cryptogramsArray[cryptogramsArray.length - 1]; max = codeToDecrypt.size(); key = new int[codeToDecrypt.size()]; /** **************** Initialize every key value on -1 ********************* */ for (int i = 0; i < key.length; i++) key[i] = -1; /** *********** Getting every chars that can be used in text ************** */ possibleChars = Operations.getPossibleChars(); /** *********** In loop program looking for most probably keys ************ */ for (int i = 0; i < max; i++) { probablyKeys = new ArrayList<>(); for (ArrayList<Integer> cryptogram : cryptogramsArray) { int value = cryptogram.get(i); for (SingleChar singleChar : possibleChars) { int key = xor(value, singleChar.getCharacter()); ProbablyKey p = getProbablyKey(key); if (p == null) { p = new ProbablyKey(key); p.addWeight(singleChar.getWeight()); probablyKeys.add(p); } else p.addWeight(singleChar.getWeight()); } } probablyKeys = Sort.sort(probablyKeys); key[i] = chooseBestKey(i); } printDecryted(); }
private int chooseBestKey(int i) { for (ProbablyKey p : probablyKeys) { int counter = 0; for (ArrayList<Integer> cryptogram : cryptogramsArray) { int encrypted = xor(cryptogram.get(i), p.getKey()); if (!isCharacter(encrypted)) break; counter++; } if (counter > cryptogramsArray.length - 1) return p.getKey(); } return -1; }
private ProbablyKey getProbablyKey(int key) { for (ProbablyKey probablyKey : probablyKeys) if (probablyKey.getKey() == key) return probablyKey; return null; }