维吉尼亚密码算法
程序员文章站
2022-07-08 20:34:46
...
算法的实现
package com.custs.msy;
public class Vigenere {
/**
* 大写字母表
*/
static String dateList="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 处理**
* @param key
* @param inform
* @return
*/
public static String dealKey(String key,String inform){
key = key.toUpperCase();//转大写
key = key.replaceAll("[^A-Z]", "");//去除所有非字母的字符
StringBuffer sb = new StringBuffer(key);
String realKey = "";
if(sb.length()!=inform.length()){
//如果**长度与inform不同,则需要生成**字符串
if(sb.length()<inform.length()){
//如果**长度比inform短,则以不断重复**的方式生成**字符串
while(sb.length()<inform.length()){
sb.append(key);
}
}
//此时,**字符串的长度大于或等于inform长度
//将**字符串截取为与inform等长的字符串
realKey=sb.substring(0, inform.length());
}
return realKey;
}
/**
*
* @param inform//原文
* @param key//**
* @return 密文
*/
public static String buildPass(String inform,String key){
inform = inform.toUpperCase();//转大写
inform = inform.replaceAll("[^A-Z]", "");//去除所有非字母的字符
key = dealKey(key, inform);
int len = key.length();
StringBuffer sb = new StringBuffer();
for(int i=0;i<len;i++){
int row = dateList.indexOf(key.charAt(i));//密码表的行
int col=dateList.indexOf(inform.charAt(i));//密码表的列号
int index=(row+col)%26;
sb.append(dateList.charAt(index));//生成密文
}
return sb.toString();
}
public static String decrypt(String pass,String key){
pass = pass.toUpperCase();//转大写
pass = pass.replaceAll("[^A-Z]", "");//去除所有非字母的字符
key = dealKey(key, pass);
int len = key.length();
StringBuffer sb = new StringBuffer();
for(int i=0;i<len;i++){
int row=dateList.indexOf(key.charAt(i));//行号
int col=dateList.indexOf(pass.charAt(i));//列号
int index;
if(row>col){
index=col+26-row;
}else{
index=col-row;
}
sb.append(dateList.charAt(index));
}
return sb.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入原文:");
String P=scanner.nextLine();
System.out.println("输入**:");
String K=scanner.nextLine();
System.out.println("密文:"+C);
System.out.println("明文"+R);
}
}
效果:
(一)
输入原文:
tobeor not to be
输入**:
jllkjkl
密文:CZMOXBYXEEYKO
明文TOBEORNOTTOBE
(二)
输入原文:
yes
输入**:
no
密文:LSF
明文YES
(三)
输入原文:
china
输入**:
string
密文:UAZVN
明文CHINA
上一篇: Lucene快速入门(一)