凯撒密码的加密和解密java的简单介绍

2023-02-11 10:31:09 密语知识 思思

各位大哥,在Java中用数组写的循环队列实现凯撒循环密码啊?

import java.*;

public class Practise {

public static void main(String[] args) {

String P = new String();// 明文

String K = new String();// 密钥

String C = new String();// 密文

short LR=-1;//间隔的方向,向左为-1,向右为1

P = "benrencainiaoyizhi";

K = "P";

C = "QTCGTCRPXCXPDNXOWX";

System.out.println("明文:"+P);

System.out.println("密钥:"+K);

System.out.println("密文:"+C+"\n");

CaesarCode caesar=new CaesarCode();

LR=1;

System.out.println("加密:"+caesar.encrypt(P, K, LR));

LR=-1;

System.out.println("解密:"+caesar.decrypt(K, C, LR).toLowerCase());

}

}

class CaesarCode {

private char alphabet[] = new char[26];//存储字母表

//加密

protected String encrypt(String P,String K,short LR)

{

int i=0,j=0,n=0;//n是间隔

String C=new String();//密文

P=P.toUpperCase();

P=getNewP(P);

K=K.toUpperCase();

n=getN(K);

//将明文转换成密文

for(i=0;iP.length();i++)

{

j=String.valueOf(alphabet).indexOf(P.charAt(i));//获取密文字母在字母表所在的下标

j=(j+n*LR+26)%26;//向左或向右移动n位

C+=(char)(j+65);

}

return C;

}

//解密

protected String decrypt(String K,String C,short LR)

{

int i=0,j=0,n=0;//n是间隔

String P=new String();//明文

K=K.toUpperCase();

C=C.replaceAll(" +"," ");

C=C.toUpperCase();

n=getN(K);

//将密文转换成明文

for(i=0;iC.length();i++)

{

j=String.valueOf(alphabet).indexOf(C.charAt(i));//获取密文字母在字母表所在的下标

j=(j+n*LR+26)%26;//向左或向右移动n位

P+=(char)(j+65);

}

return P;

}

//获取经过处理的明文

private String getNewP(String P)

{

int i=0;

char p[] = P.toCharArray();

for (i = 0; i P.length(); i++) {

if (p[i] 'A' || p[i] 'Z')// 将非字母换成空格

{

p[i] = ' ';

}

}

P = String.valueOf(p);

P = P.replaceAll(" +", "");// 将明文的所有空格去掉

return P;

}

//获取间隔

private int getN(String K)

{

int i=0,n=0;

//生成字母表

for(i=0;i26;i++)

{

alphabet[i]=(char)(i+65);//字母A在ASCII表中的值是065

}

if(isNum(K))

{

n=Integer.parseInt(K);

}

else

{

n=String.valueOf(alphabet).indexOf(K);//当K不是数字时适用

}

return n;

}

//判断密钥是否为数字

private boolean isNum(String K)

{

return K.matches("[0-9]+");//+表示1个或多个(如"3"或"225")

}

}

凯撒密码的加密和解密java的简单介绍 第1张

凯撒加密算法(最简单的对称加密)

凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动 2 位,则 字母 A 将变为 C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则变为 A,字母 Z 变为 B。

因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文: “Jgnnq” 。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移两位 变为“Hello” 。这里,移动的位数“2”是加密和解密所用的密钥。

该程序既可用于加密又可用于解密。只要传入明文和偏移量即可加密,解密需要传入密文和负的偏移量就可以解密。

输出的结果:

凯撒密码由于加解密比较简单,密钥总共只有 26 个,攻击者得到密文后即使不知道密钥,也可一个一个地试过去,最多试 26 次就可以得到明文。

这里不光根据 offset 偏移进行加密,还加上了字符所在的下标进行混合加密。

输出的结果:

用java 编写一个凯撒加密和解密

import java.util.Scanner;

public class Caeser {

private String table; // 定义密钥字母表

private int key; // 定义密钥key

public Caeser(String table, int key) {

// 根据不同的字母表和不同的密钥生成一个新的凯撒算法,达到通用的目的

super();

this.table = table;

this.key = key;

}

public String encrypt(String from) {

//凯撒加密算法,传入明文字符串,返回一个密文字符串

String to = "";

for (int i = 0; i from.length(); i++) {

to += table.charAt((table.indexOf(from.charAt(i))+key)%table.length());

}

return to;

}

public static void main(String[] args) {

Caeser caeser = new Caeser("abcdefghijklmnopqrstuvwxyz", 3);

Scanner scanner = new Scanner(System.in);

System.out.println("请输入要加密的字符串");

String str =scanner.nextLine(); //输入字符串 security

String result = caeser.encrypt(str); //调用加密方法进行加密

System.out.print(result); // 可得结果 vhfxulwb

}

}