-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproblem059.java
More file actions
85 lines (76 loc) · 3.29 KB
/
problem059.java
File metadata and controls
85 lines (76 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package project_beuler;
import java.util.ArrayList;
import java.util.Scanner;
public class problem059 {
// Each character on a computer is assigned a unique code and the
// preferred standard is ASCII (American Standard Code for
// Information Interchange). For example, uppercase A = 65,
// asterisk (*) = 42, and lowercase k = 107.
//
// A modern encryption method is to take a text file, convert the bytes to ASCII,
// then XOR each byte with a given value, taken from a secret key. The advantage
// with the XOR function is that using the same encryption key on the cipher text,
// restores the plain text; for example, 65 XOR 42 = 107, then 107 XOR 42 = 65.
//
// For unbreakable encryption, the key is the same length as the plain text message,
// and the key is made up of random bytes. The user would keep the encrypted message
// and the encryption key in different locations, and without both "halves", it is
// impossible to decrypt the message.
//
// Unfortunately, this method is impractical for most users, so the modified method
// is to use a password as a key. If the password is shorter than the message,
// which is likely, the key is repeated cyclically throughout the message. The
// balance for this method is using a sufficiently long password key for security,
// but short enough to be memorable.
//
// Your task has been made easy, as the encryption key consists of three lower
// case characters. Using p059_cipher.txt (right click and 'Save Link/Target As...'),
// a file containing the encrypted ASCII codes, and the knowledge that the plain
// text must contain common English words, decrypt the message and find the sum
// of the ASCII values in the original text.
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] input = Interface.parseArr("problem059.txt")[0].split(",");
Scanner reader = new Scanner(System.in);
for(char key1 = 'a'; key1 <= 'z'; key1++)
for(char key2 = 'a'; key2 <= 'z'; key2++)
for(char key3 = 'a'; key3 <= 'z'; key3++) {
int cycle = 0;
boolean english = true;
String translated = "";
int sum = 0;
for(String i : input) {
char n = decrypt(i, new char[] {key1, key2, key3}[cycle]);
english &= isEnglish(n);
translated += n;
sum += n;
cycle = (cycle+1)%3;
}
if( english && !quit(reader) ) {
System.out.println(translated);
System.out.println("KEYS: "+ key1 +" "+ key2 +" "+ key3);
System.out.println("SUM: "+sum);
}
}
}
public static boolean isEnglish(char c) {
return //32 <= c && c <= 127;
(
('a' <= c && c <= 'z') ||
('A' <= c && c <= 'Z') ||
('0' <= c && c <= '9') ||
c == ' ' || c == '\t' || c == '\n' ||
c == '.' || c == ',' || c == '!' || c == '?' || c == '\"' || c == '\'' ||
c == '/' || c == '\\' || c == '-' || c == '_' || c == '(' || c == ')' || c == '+' || c == '=' ||
c == ';' || c == ':' || c == '#' || c == '$' || c == '%' || c == '^' || c == '&' || c == '*' || // c == '
c == '{' || c == '}' || c == '[' || c == ']' || c == '<' || c == '>' || c == '`'|| c == '~'
);
}
public static char decrypt(String n, int key) {
return (char) (Integer.parseInt(n) ^ key);
}
public static boolean quit(Scanner reader) {
System.out.println("\nPress enter to continue, anything else to quit;");
return reader.nextLine().length() > 0;
}
}