展开全部
之前写着玩的恺撒加密/解密,不是专门根据你列的功能写的,所以和你要的比有点多,不过你要的东西32313133353236313431303231363533e78988e69d8331333264623839都有,拿去参考/修改吧.
import java.util.Scanner;
public class CaesarCipherTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
CaesarCipher cc = new CaesarCipher();
String encryptTestString = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.";
String decryptTestString = "rkckxilynirobocooxwiyvnpbsoxnklbkrkwmkxiyedovvwogroborocqyxo";
int encryptTestShift = 5;
System.out.println("Encrypting contents with shift of "
+ encryptTestShift + "\n" + encryptTestString);
System.out.println(cc.encrypt(encryptTestString, encryptTestShift));
System.out.println("\n\nTrying to decrypt\n"
+ decryptTestString + "\n");
String[] decryptResults = cc.decrypt(decryptTestString);
boolean found = false;
for (String s : decryptResults) {
if (s != null) {
if (s.equals(decryptResults[0])) {
System.out.println("Letters in contents " +
"(with frequency from high to low):");
System.out.println(s + "\n\n");
}
else {
if (s != null) {
System.out.println(s);
}
}
}
else {
System.out.println("\nHave you found any" +
"readable contents? (Y/N)");
String input = in.next();
if (input.charAt(0) == 'Y' || input.charAt(0) == 'y') {
found = true;
break;
}
else {
System.out.println("\nTrying for other key letters" +
"with lower frequency:\n");
}
}
}
if (!found) {
System.out
.println("\n\nFinished of trying all possible shifts.");
}
System.out.println("Job finished, exiting...");
}
}
class CaesarCipher {
private static final int NUMBER_OF_LETTERS = 26;
private static final String LETTERS_BY_FREQUENCY = "E TAON RISHD LFCMU GYPWBV KXJQZ";
private static final int LETTER_FREQUENCY_GROUPS = 6;
private Letter[] letters;
public CaesarCipher () {
init();
}
public void init() {
letters = new Letter[NUMBER_OF_LETTERS];
int counter = 0;
for (Letter f : Letter.values()) {
f.resetFrequency();
letters[counter++] = f;
}
}
public String encrypt(String message, int shift) {
String result = "";
for (char c : message.toCharArray()) {
result += getShift(c, shift);
}
return result;
}
public String[] decrypt(String message) {
String[] result = new String[NUMBER_OF_LETTERS
+ LETTER_FREQUENCY_GROUPS];
updateFrequency(message);
sortByFrequency();
result[0] = getFrequencyList();
int counter = 1;
for (char c : LETTERS_BY_FREQUENCY.toCharArray()) {
if (c == ' ') {
result[counter++] = null;
}
else {
result[counter++] = encrypt(message, c
- letters[0].name().charAt(0));
}
}
return result;
}
private char getShift(char c, int shift) {
if (Character.isLetter(c)) {
boolean isLower = Character.isLowerCase(c);
c = (isLower) ? Character.toUpperCase(c) : c;
c = Letter.valueOf(Letter.class,
Character.toString(c).toUpperCase()).getShift(shift);
c = (isLower) ? Character.toLowerCase(c) : c;
}
return c;
}
private void updateFrequency(String message) {
for (char c : message.toCharArray()) {
if (Character.isLetter(c)) {
Letter.valueOf(Letter.class,
Character.toString(c).toUpperCase()).updateFrequency();
}
}
}
private void sortByFrequency() {
for (int i = 0; i < letters.length - 1; i++) {
for (int j = i; j < letters.length; j++) {
if (letters[i].getFrequency() < letters[j].getFrequency()) {
Letter temp = letters[i];
letters[i] = letters[j];
letters[j] = temp;
}
}
}
}
private String getFrequencyList() {
String result = "";
for (Letter l : letters) {
if (l.getFrequency() > 0) {
result += (l.name() + "(" + l.getFrequency() + ")");
}
}
return result;
}
}
enum Letter {
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
private static int NUMBER_OF_LETTERS = 26;
private static char LARGEST_VALUE = 'Z';
private int frequency;
Letter () {
frequency = 0;
}
public int getFrequency() {
return frequency;
}
public void updateFrequency() {
frequency++;
}
public void resetFrequency() {
frequency = 0;
}
public char getShift(int shift) {
if (shift < 0) {
shift = -shift;
shift = shift % NUMBER_OF_LETTERS;
shift = NUMBER_OF_LETTERS - shift;
}
else {
shift = shift % NUMBER_OF_LETTERS;
}
char result;
result = this.name().charAt(0);
if ((char) (result + shift) <= LARGEST_VALUE) {
result = (char) (result + shift);
}
else {
result = (char) (result - NUMBER_OF_LETTERS + shift);
}
return result;
}
}
本回答由网友推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起