凯撒密码

恺撒密码(英语: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相关的包,并且不用添加虚拟参数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值