贴代码记录一下,也欢迎学习参考~
一、算法背景
· 替代密码
替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形成密文。例如,明文字母a, b, c, d, 用d, e, f , g 做对应替换后形成密文。替代密码包括多种类型,如单表替代密码,多表替代密码,多字母替代密码等。
本例实现的凯撒(Caesar)密码是一种典型的单表替代密码,其加密方法是将明文中的每个字母用此字符在字母表中后面的第k 个字母替代。它的加密过程可以表示为下面的函数:
其中,m 为明文字母在字母表中的位置数,n 为字母表中的字母个数,k 为密钥,E(k)
为密文字母在字母表中对应的位置数。
二、参考代码
import java.io.IOException;
import java.util.Scanner;
public class Caesar {
static int ASCII;
static char[] messageArray=null;
static int i = 0;
static int key=0;
public static void main(String[] args) throws IOException {
int choice=-1;
int flag=0;
while(flag==0) {
menu();
Scanner in2=new Scanner(System.in);
choice=in2.nextInt();
switch (choice) {
case 1:
go(choice);
break;
case 2:
go(choice);
break;
case 3:
flag++;
break;
default:
System.out.println("出错!");
break;
}
}
System.out.println("谢谢您的使用!");
}
public static void menu() {
System.out.println();
System.out.println();
System.out.println("*************CaesarCipher*************");
System.out.println(" "+"1.明文加密"+" "+"2.密文解密"+" "+"3.退出");
System.out.println("**************************************");
System.out.print("请选择菜单功能:");
}
public static void go(int choice) {
boolean flag=false;
do {
flag=false;
if(choice==1)
System.out.print("请输入明文:");
else
System.out.print("请输入密文:");
Scanner in1=new Scanner(System.in);
String message=in1.nextLine();
System.out.print("请输入密钥:");
Scanner in2=new Scanner(System.in);
message=message.replaceAll("\\s*", "");
try
{
key=in2.nextInt();
}catch (Exception e) {
flag=true;
System.out.println("密钥必须为数字!请重新输入...");
}
if(flag!=true) {
messageArray=message.toCharArray();
for(i=0; i < messageArray.length; i++) {
ASCII=Integer.valueOf(messageArray[i]);
if(ASCII<65||(ASCII>90&&ASCII<97)||ASCII>122) {
flag=true;
System.out.println("请输入英文!请再次尝试...");
break;
}
else
switch (choice) {
case 1:
encode();
break;
case 2:
decode();
break;
default:
System.out.println("出错!");
break;
}
}
}
}while(flag);
System.out.print("密文为:");
for(int i = 0; i < messageArray.length; i++)
System.out.print(messageArray[i]);
}
public static void encode() {
if(ASCII>=97&&ASCII<=122)//小写字母
messageArray[i]=(char) ((ASCII+key-97)%26+97);
else //大写字母
messageArray[i]=(char) ((ASCII+key-65)%26+65);
}
public static void decode() {
if(ASCII>=97&&ASCII<=122)//小写字母
messageArray[i]=(char) ((ASCII-97+26-key)%26+97);
else //大写字母
messageArray[i]=(char) ((ASCII-65+26-key)%26+65);
}
}
三、参考结果
有错误的地方欢迎指正~