网络安全学习笔记-Vigenere加密+GUI图形界面

前言:代码说明

该代码由client,server,playfair三个类组成,client发送信息到server,playfair是加密算法的主要实现,含有main函数,可以独立演示加密算法,也可以配合client和server的代码共同实现GUI的界面

1⃣️Vigenere.java的实现

package 实验1.古典密码2;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;

public class Vigenere implements Serializable {
    private  StringBuilder plainText;
    private  StringBuilder key;
    private  LinkedList<Character> std_seq;
    private  char[][] matrix;
    private ArrayList<Character> cipher;
     class locate{
        int i,j;

        /**
         *
         * @param m  加密矩阵
         * @param c1 明文字符
         * @param c2 密钥字符
         */
        locate(int i,int j){
            this.i=i;
            this.j=j;
        }
        locate(char[][] m,char c1,char c2){
            for (int k = 0; k < m[0].length; k++) {
                if (m[0][k]==c1){
                    j=k;//明文所在列
                }
                if (m[0][k]==c2){
                    i=k;//密钥所在行
                }
            }
        }

        public int getI() {
            return i;
        }

        public int getJ() {
            return j;
        }
    }
     void init(){

        final int count=26;
        for (int i = 0; i < count; i++) {
            std_seq.add((char)('a'+i));
        }
        LinkedList<Character> temp=new LinkedList<>(std_seq);
        for (int i = 0; i < count; i++) {
            initRow(matrix, i, temp);
            Character head=temp.poll();//获取并移除list的首元素
            temp.add(head);//完了之后就添加到list到尾部
        }

    }

    public Vigenere(String pt,String key){
        this.plainText=new StringBuilder(pt);
        this.key=new StringBuilder(key);
        matrix=new char[26][26];
        std_seq=new LinkedList<>();
        init();
    }
    private void initRow(char[][] m,int row,LinkedList<Character> list){
        for (int i = 0; i < m[row].length; i++) {
           m[row][i]=list.get(i);
        }
    }

    /**
     * data security
     * best
     * @param args
     */
    public static void main(String[] args) {
        Vigenere v1=new Vigenere("data security", "best");
        v1.code();
        System.out.println();
        v1.decode();
    }

    public  void printMatrix(char[][] matrix){
        for (var item : matrix)
        {
            for (var item1 : item)
            {
                System.out.printf("%3c",item1);
            }
            System.out.println();
        }
    }
    public  void printArray(ArrayList<Character> a){
        for (var item : a)
        {
            System.out.printf("%c",item);
        }
    }
    public  void code(){
        ArrayList<Character> res=new ArrayList<>();
        final int len=key.length();
        plainText =new StringBuilder(new String(plainText).replaceAll("\\s+", ""));
        for (int i = 0; i < plainText.length(); ) {
            for (int j = 0; j < len; j++) {
                locate l1=new locate(matrix, plainText.charAt(i++), key.charAt(j));
                char ch1=matrix[l1.getI()][l1.getJ()];
                res.add(ch1);
            }
        }
        cipher=res;    
    }

    /**
     * 根据密钥和密文反解出列,也就是反解出明文
     *
     *
     */
    public ArrayList<Character> decode(){
        ArrayList<Character> res=new ArrayList<>();
        final int len=key.length();
        for (int i = 0; i < cipher.size();) {
            for (int j = 0; j < len; j++) {
                locate l1=find(key.charAt(j),cipher.get(i++));
                char ans=std_seq.get(l1.getJ());
                res.add(ans);
            }
        }
//        printArray(res);
        return res;
    }
    public locate find(char c1,char c2){
        int a1=0,a2=0;
        for (int i = 0; i < std_seq.size(); i++) {
            if (c1==std_seq.get(i)){
                a1=i;
                break;
            }
        }
        for (int i = 0; i < matrix[i].length; i++) {
            if (c2==matrix[a1][i]){
                a2=i;
                break;
            }
        }
        return new locate(a1, a2);
    }
}

2⃣️Client.java的代码

package 实验1.古典密码2;


import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Client extends JFrame {
    Socket s;
    private JButton send;
    private JTextField plainText;
    private JTextField key;
    private JLabel plainLabel;
    private JLabel keyLabel;
    private JPanel north;
    private JPanel center;
    private JPanel south;
    /**
     * data security
     * best
     * @param args
     */
    {
        send=new JButton("发送");

        plainText=new JTextField(20);
        plainLabel=new JLabel("明文");

        key=new JTextField(20);
        keyLabel=new JLabel("密钥");


        north=new JPanel();
        center=new JPanel();
        south=new JPanel();

        north.add(plainLabel);
        north.add(plainText);

        center.add(keyLabel);
        center.add(key);

        south.add(send);
        /**
         * data security
         * best
         * @param args
         */
        add(north,BorderLayout.NORTH);
        add(center,BorderLayout.CENTER);
        add(south,BorderLayout.SOUTH);

        send.addActionListener(e->{
            String iplain=plainText.getText();
            try {
                //s=new Socket("127.0.0.1",30000);
                Vigenere v=new Vigenere(plainText.getText(), key.getText());
                v.code();
                ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
                oos.writeObject(v);
                oos.flush();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        });

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    public Client(){
        super("加密窗口🔐");
        try {
            s=new Socket("127.0.0.1",40000);
        } catch (IOException e) {

        }
    }

    public static void main(String[] args) {
        new Client();
    }
}

3⃣️server.java的代码

package 实验1.古典密码2;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server extends JFrame {
    private ServerSocket ss;
    private Socket s;
    private JLabel ptLabel;
    private JTextField ptcnt;
    private JButton get;
    private JPanel jp;
    {
        /**
         * data security
         * best
         * @param args
         */
        ptLabel=new JLabel("明文:");
        ptcnt=new JTextField(20);
        get=new JButton("一键解密🔓");

        jp=new JPanel();
        jp.add(ptLabel);
        jp.add(ptcnt);

        add(jp,BorderLayout.NORTH);
        add(get,BorderLayout.SOUTH);

        get.addActionListener(e->{
            try {
                ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
                Vigenere v=(Vigenere)ois.readObject();
                ArrayList<Character> ans= v.decode();
                StringBuilder s=new StringBuilder();
                for (var item : ans)
                {
                    s.append(item);
                }
                ptcnt.setText(s.toString());
            } catch (Exception e1) {
                e1.printStackTrace();
            }

        });
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    public Server(){
        super("解密大行动🔓");
        try {
            ss=new ServerSocket(40000);
            s=ss.accept();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server();
    }
}

4⃣️输入样例

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿维的博客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值