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 = 0i <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
}
}
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=0i<P.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=0i<C.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 = 0i <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=0i<26i++)
{
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")
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)