java bs加密_凯撒加密问题java

展开全部

之前写着玩的恺撒加密/解密,不是专门根据你列的功能写的,所以和你要的比有点多,不过你要的东西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;

}

}

本回答由网友推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值