恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。----百度百科
如下图所示:
恺撒密码属于古典密码,是对称加密的,即加密密钥和解密密钥是相同的。下面用了javafx技术做了一个GUI版的。这里自己的jdk是11,需要自己导入javafx的包。
Entity层
package entity;
public class Caesar {
/*
* @param: [plainText,key]
* @return: boolean
* @description: 原文和秘钥合理性的判断
*/
public static boolean validate(String plainText, int key){
if(plainText.matches("[a-zA-Z]*") && (key >=0 && key <=25)){
return true;
}
else
return false;
}
/*
* @param: [plainText, key]
* @return: java.lang.String
* @description: 凯撒加密算法
*/
public static String CaesarEncode(String plainText, int key){
StringBuilder buffer = new StringBuilder(plainText);
int len = buffer.length();
for(int i=0; i<len; i++){
if(buffer.charAt(i) >= 'A' && buffer.charAt(i) <='Z'){
buffer.setCharAt(i,(char) ((buffer.charAt(i) -'A' + key) %26 + 0x41) );
}
else {
buffer.setCharAt(i,(char) ((buffer.charAt(i) -'a' + key) %26 + 0x61) );
}
}
return buffer.toString();
}
/*
* @param: [plainText, key]
* @return: java.lang.String
* @description: 凯撒解密算法
*/
public static String CaesarDecode(String plainText, int key){
StringBuilder buffer = new StringBuilder(plainText);
int len = buffer.length();
for(int i=0; i<len; i++){
if(buffer.charAt(i) >= 'A' && buffer.charAt(i) <='Z'){
buffer.setCharAt(i,(char) ((buffer.charAt(i) -'A' - key + 26) %26 + 0x41));
}
else {
buffer.setCharAt(i,(char) ((buffer.charAt(i) -'a' - key +26) %26 + 0x61));
}
}
return buffer.toString();
}
}
Controller层
package controller;
import entity.Caesar;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
public class Controller {
@FXML
private TextArea input;
@FXML
private TextArea output;
@FXML
private TextField cipher;
@FXML
private Button encode;
@FXML
private Button decode;
@FXML
private Button add;
private int key;
private String string;
/*
* @param: []
* @return: void
* @description:得到秘钥,类型为int
*/
public void getKey(){
this.key = Integer.parseInt(cipher.getText());
}
/*
* @param: []
* @return: void
* @description:异常处理,秘钥和明文或密文有限制
*/
public void ExceptionHandle(){
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Waring");
alert.setContentText("原文或秘钥不符合规范,原文因为英文字母,秘钥范围[0,25]");
alert.show();
}
/*
* @param: []
* @return: void
* @description:解密过程
*/
public void DecodingMethod(){
if(Caesar.validate(input.getText(),key)){
this.string = Caesar.CaesarDecode(input.getText(),key);
output.setText(string);
}
else{
ExceptionHandle();
}
}
/*
* @param: []
* @return: void
* @description:加密过程
*/
public void EncodingMethod(){
if(Caesar.validate(input.getText(),key)){
this.string = Caesar.CaesarEncode(input.getText(),key);
output.setText(string);
}
else{
ExceptionHandle();
}
}
}
View层
在这里插入代<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="400.0" prefWidth="606.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.Controller">
<children>
<Accordion />
<AnchorPane layoutX="14.0" prefHeight="400.0" prefWidth="600.0">
<children>
<TextArea fx:id="input" layoutX="20.0" layoutY="118.0" prefHeight="119.0" prefWidth="188.0" />
<TextArea fx:id="output" layoutX="378.0" layoutY="118.0" prefHeight="119.0" prefWidth="188.0" />
<Button fx:id="encode" onAction="#EncodingMethod" layoutX="266.0" layoutY="140.0" mnemonicParsing="false" text="加密" />
<Button fx:id="decode" onAction="#DecodingMethod" layoutX="266.0" layoutY="185.0" mnemonicParsing="false" text="解密" />
<Label layoutX="5.0" layoutY="61.0" prefHeight="20.0" prefWidth="50.0" text="秘钥" />
<TextField fx:id="cipher" layoutX="47.0" layoutY="56.0" prefHeight="30.0" prefWidth="114.0" />
<Button fx:id="add" onAction="#getKey" layoutX="168.0" layoutY="56.0" mnemonicParsing="false" prefHeight="30.0" prefWidth="41.0" text="+" />
</children>
</AnchorPane>
</children>
</AnchorPane>
Test
package test;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class CaesarTest extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/view/GUI.fxml"));
Scene scene = new Scene(root,600,400);
stage.setScene(scene);
stage.setTitle("CaesarCipher by Wzh");
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
在jdk11上运行时还需要去配置VM option ,否者会出现“找不到javafx运行组件的问题”设置VM option的参数值为 –module-path “你的javafx路径\lib” --add-modules=javafx.controls,javafx.fxml
jdk8自带javafx相关的包,并且不用添加虚拟参数。