滚动密钥密码
对于周期代换密码,当密钥的长度d和明文一样长时,就成为滚动密钥密码。
具体可见如下表所示:
明文 | meetatnineintheevening |
---|---|
密钥 | beijingmeetatnineinthe |
密文 | NIMCIGTURIBNMUMRZMABUK |
java代码实现如下:
package com.ibianma;
/**
* 滚动密钥密码
*/
public class ScrollPassword {
/**
* 加密算法
* @param plaintext 明文
* @param chars 密钥
* @return 密文
*/
public String encryption(String plaintext,char[][] chars){
String ciphertext = "";
char[] charArray = plaintext.toCharArray();
for (int i = 0; i <charArray.length ; i++) {
int j = charArray[i];
if (j>=97&&j<=97+26){
int k = chars[1][i];
char te = (char) (((j - 97) + (k - 65)) % 26+65);
ciphertext = ciphertext+te;
}
if (j>=65&&j<=65+26){
int k = chars[1][i];
char te = (char) (((j - 65) + (k - 65)) % 26+97);
ciphertext = ciphertext+te;
}
}
return ciphertext;
}
/**
* 解密算法
* @param ciphertext 密文
* @param chars 密钥
* @return 明文
*/
public String decrypt(String ciphertext,char[][] chars){
String plaintext="";
char[] charArray = ciphertext.toCharArray();
for (int i = 0; i <charArray.length ; i++) {
int j = charArray[i];
if (j>=97&&j<=97+26){
int k = chars[1][i];
char te = (char) (((j - 97) + 26-(k - 65)) % 26+65);
plaintext = plaintext+te;
}
if (j>=65&&j<=65+26){
int k = chars[1][i];
char te = (char) (((j - 65) + 26-(k - 65)) % 26+97);
plaintext = plaintext+te;
}
}
return plaintext;
}
/**
* 获取密钥表
* @param plaintext 明文
* @param secretKey 密钥
* @return 密钥
*/
public char[][] getSecretKey(String plaintext,String secretKey){
char[][] chars = new char[2][plaintext.length()];
for (int i = 0; i <plaintext.length() ; i++) {
chars[0][i]=plaintext.charAt(i);
if (i<secretKey.length()) {
chars[1][i] = secretKey.toUpperCase().charAt(i);
}else {
chars[1][i] = plaintext.charAt(i - secretKey.length());
}
}
return chars;
}
}
测试代码如下:
package com.ibianma;
import java.util.Scanner;
public class CodingTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入密匙:");
String s = scanner.next();
ScrollPassword mima = new ScrollPassword();
System.out.print("请输入明文:");
String mingWen = scanner.next();
char[][] secretKey = mima.getSecretKey(mingWen, s);
System.out.println("密钥如下:");
for (int i = 0; i <2 ; i++) {
for (int j = 0; j <secretKey[0].length ; j++) {
System.out.print(secretKey[i][j]+" ");
}
System.out.println();
}
String sl = mima.encryption(mingWen,secretKey);
System.out.println("加密后的密文是:"+sl);
String s2 = mima.decrypt(sl,secretKey);
System.out.println("解密后的明文是:"+s2);
}
}
测试结果如下:
请输入密匙:dfghn
请输入明文:dfvghndfgdgnj
密钥如下:
d f v g h n d f g d g n j
D F G H N d f v g h n d f
加密后的密文是:GKBNUWOGSQZWU
解密后的明文是:dfvghndLgdgnj